языку - форум язык r
Как сделать отличный R воспроизводимый пример (16)
Методические рекомендации:
Ваша главная цель при составлении ваших вопросов должна состоять в том, чтобы сделать читателей как можно проще для понимания и воспроизведения вашей проблемы в своих системах. Для этого:
- Предоставить входные данные
- Обеспечить ожидаемый результат
-
Объясните свою проблему кратко
- если у вас более 20 строк текста + код, вы можете вернуться и упростить
- максимально упростите ваш код, сохраняя проблему / ошибку
Это требует некоторой работы, но кажется справедливым компромиссом, поскольку вы просите других сделать работу за вас.
Предоставление данных:
Встроенные наборы данных
Наилучшим вариантом
на сегодняшний день
является использование встроенных наборов данных.
Это позволяет другим легко работать над вашей проблемой.
Введите
data()
в приглашении R, чтобы увидеть, какие данные вам доступны.
Несколько классических примеров:
-
iris
-
mtcars
-
ggplot2::diamonds
(внешний пакет, но почти у всех он есть)
Посмотрите этот SO QA, чтобы узнать, как найти наборы данных, подходящие для вашей проблемы.
Если вы можете перефразировать свою проблему, используя встроенные наборы данных, у вас гораздо больше шансов получить хорошие ответы (и положительные отзывы).
Собственные данные
Если ваша проблема очень специфична для типа данных, которые не представлены в существующих наборах данных, предоставьте код R, который генерирует наименьший возможный набор данных, в котором ваша проблема проявляется. Например
set.seed(1) # important to make random data reproducible
myData <- data.frame(a=sample(letters[1:5], 20, rep=T), b=runif(20))
Теперь кто-то, пытающийся ответить на мой вопрос, может скопировать / вставить эти две строки и немедленно начать работу над проблемой.
dput
В качестве
последнего средства
вы можете использовать
dput
для преобразования объекта данных в код R (например,
dput(myData)
).
Я говорю как «последнее средство», потому что вывод
dput
часто довольно громоздкий, раздражает копирование-вставка и затеняет остальную часть вашего вопроса.
Обеспечить ожидаемый результат:
Кто-то однажды сказал:
Картина ожидаемого результата стоит 1000 слов
- очень мудрый человек
Если вы можете добавить что-то вроде «Я ожидал получить этот результат»:
cyl mean.hp
1: 6 122.28571
2: 4 82.63636
3: 8 209.21429
на ваш вопрос, люди с большей вероятностью быстро поймут, что вы пытаетесь сделать. Если ожидаемый результат является большим и громоздким, то вы, вероятно, недостаточно задумывались о том, как упростить вашу проблему (см. Далее).
Объясните свою проблему кратко
Главное, чтобы максимально упростить вашу проблему, прежде чем задавать вопрос. Перефразирование проблемы для работы со встроенными наборами данных очень поможет в этом отношении. Вы также часто обнаружите, что, пройдя процесс упрощения, вы решите свою собственную проблему.
Вот несколько примеров хороших вопросов:
В обоих случаях проблемы пользователя почти наверняка не связаны с простыми примерами, которые они предоставляют. Скорее они абстрагировали природу своей проблемы и применили ее к простому набору данных, чтобы задать свой вопрос.
Почему еще один ответ на этот вопрос?
Этот ответ сфокусирован на том, что я считаю лучшей практикой: используйте встроенные наборы данных и предоставьте то, что вы ожидаете в результате, в минимальной форме. Наиболее выдающиеся ответы сосредоточены на других аспектах. Я не ожидаю, что этот ответ поднимется до какой-то известности; это здесь исключительно для того, чтобы я мог ссылаться на него в комментариях к вопросам новичка.
При обсуждении производительности с коллегами, обучении, отправке отчета об ошибках или поиске руководства в списках рассылки и здесь, в Переполнении стека, часто задают воспроизводимый пример и всегда помогают
Каковы ваши советы по созданию отличного примера? Как вы вставляете структуры данных из r в текстовом формате? Какую другую информацию вы должны включить?
Есть ли другие хитрости помимо использования
dput()
,
dump()
или
structure()
?
Когда следует включать операторы
library()
или
require()
?
Какие зарезервированные слова следует избегать, помимо
c
,
df
,
data
и т. Д.?
Как сделать великолепный воспроизводимый пример?
Вот некоторые из моих предложений:
- Попробуйте использовать наборы данных R по умолчанию
-
Если у вас есть свой собственный набор данных, включите их
dput
, чтобы другие могли вам легче помочь -
Не используйте,
install.package()
если это действительно необходимо, люди поймут, если вы просто используетеrequire
илиlibrary
-
Постарайся быть кратким,
- Есть какой-то набор данных
- Постарайтесь описать нужный вам результат как можно проще
- Сделай это сам, прежде чем задать вопрос
- Загрузить изображение легко, поэтому загружайте графики, если у вас есть
- Также включите любые ошибки, которые могут у вас возникнуть
Все это является частью воспроизводимого примера.
Пожалуйста, не вставляйте выходные данные консоли следующим образом:
If I have a matrix x as follows:
> x <- matrix(1:8, nrow=4, ncol=2,
dimnames=list(c("A","B","C","D"), c("x","y")))
> x
x y
A 1 5
B 2 6
C 3 7
D 4 8
>
How can I turn it into a dataframe with 8 rows, and three
columns named `row`, `col`, and `value`, which have the
dimension names as the values of `row` and `col`, like this:
> x.df
row col value
1 A x 1
...
(To which the answer might be:
> x.df <- reshape(data.frame(row=rownames(x), x), direction="long",
+ varying=list(colnames(x)), times=colnames(x),
+ v.names="value", timevar="col", idvar="row")
)
Мы не можем скопировать и вставить его напрямую.
Для того,
чтобы вопросы и ответы правильно воспроизводимым, попробуйте удалить
+
и ,
>
прежде чем отправлять его и положить
#
для выходов и комментарии ,
как это:
#If I have a matrix x as follows:
x <- matrix(1:8, nrow=4, ncol=2,
dimnames=list(c("A","B","C","D"), c("x","y")))
x
# x y
#A 1 5
#B 2 6
#C 3 7
#D 4 8
# How can I turn it into a dataframe with 8 rows, and three
# columns named `row`, `col`, and `value`, which have the
# dimension names as the values of `row` and `col`, like this:
#x.df
# row col value
#1 A x 1
#...
#To which the answer might be:
x.df <- reshape(data.frame(row=rownames(x), x), direction="long",
varying=list(colnames(x)), times=colnames(x),
v.names="value", timevar="col", idvar="row")
Еще одна вещь, если вы использовали какую-либо функцию из определенного пакета, упомяните эту библиотеку.
Помимо всех вышеперечисленных ответов , которые я нашел очень интересно, это иногда может быть очень легко , как это обсуждается здесь: - КАК СДЕЛАТЬ МИНИМАЛЬНЫЙ воспроизводимый Пример получить помощь R
Есть много способов сделать случайный вектор Создать вектор из 100 чисел со случайными значениями в R, округленными до 2 десятичных знаков или случайной матрицей в R
mydf1<- matrix(rnorm(20),nrow=20,ncol=5)
Обратите внимание, что иногда очень сложно поделиться данными из-за различных причин, таких как размерность и т. Д. Однако все вышеприведенные ответы очень полезны и очень важны для размышления и использования, когда кто-то хочет привести пример воспроизводимых данных. Но учтите, что для того, чтобы сделать данные такими же репрезентативными, как и исходные (в случае, если ОП не может предоставить исходные данные совместно), полезно добавить некоторую информацию в пример данных как (если мы назовем данные mydf1)
class(mydf1)
# this shows the type of the data you have
dim(mydf1)
# this shows the dimension of your data
Кроме того, нужно знать тип, длину и атрибуты данных, которые могут быть структурами данных.
#found based on the following
typeof(mydf1), what it is.
length(mydf1), how many elements it contains.
attributes(mydf1), additional arbitrary metadata.
#If you cannot share your original data, you can str it and give an idea about the structure of your data
head(str(mydf1))
(Вот мой совет от Как написать воспроизводимый пример . Я попытался сделать его коротким, но приятным)
Как написать воспроизводимый пример.
Скорее всего, вы получите хорошую помощь по проблеме R, если предоставите воспроизводимый пример. Воспроизводимый пример позволяет кому-то другому воссоздать вашу проблему, просто скопировав и вставив код R.
Чтобы сделать ваш пример воспроизводимым, нужно включить четыре вещи: необходимые пакеты, данные, код и описание вашей среды R.
-
Пакеты должны быть загружены в верхней части скрипта, так что легко увидеть, какие из них нужны в примере.
-
Самый простой способ включить данные в электронное письмо или вопрос переполнения стека - это использовать
dput()
для генерации кода R для его воссоздания. Например, чтобы воссоздать набор данныхmtcars
в R, я бы выполнил следующие шаги:-
Запустите
dput(mtcars)
в R - Скопируйте вывод
-
В моем воспроизводимом скрипте введите
mtcars <-
затем вставьте.
-
Запустите
-
Потратьте немного времени, чтобы ваш код легко читался другими:
-
убедитесь, что вы использовали пробелы и имена переменных краткие, но информативные
-
используйте комментарии, чтобы указать, где ваша проблема лежит
-
сделать все возможное, чтобы удалить все, что не связано с проблемой.
Чем короче ваш код, тем легче его понять.
-
-
Включите вывод
sessionInfo()
в комментарий в своем коде. Это обобщает вашу среду R и позволяет легко проверить, используете ли вы устаревший пакет.
Вы можете проверить, действительно ли вы создали воспроизводимый пример, запустив новый сеанс R и вставив в него скрипт.
Прежде чем поместить весь свой код в электронное письмо, подумайте о том, чтобы поместить его на Gist GitHub Это даст вашему коду хорошую подсветку синтаксиса, и вам не придется беспокоиться о том, что система электронной почты может что-то испортить.
Вдохновленный этим постом, я теперь использую удобную функцию
reproduce(<mydata>)
когда мне нужно отправить в .
БЫСТРЫЕ ИНСТРУКЦИИ
Если
myData
- это имя вашего объекта для воспроизведения, запустите следующее в R:
install.packages("devtools")
library(devtools)
source_url("https://raw.github.com/rsaporta/pubR/gitbranch/reproduce.R")
reproduce(myData)
Подробности:
Эта функция является интеллектуальной оболочкой для
dput
и выполняет следующие действия:
- автоматически выбирает большой набор данных (в зависимости от размера и класса. Размер выборки можно регулировать)
-
создает вывод
dput
- позволяет указать, какие столбцы экспортировать
-
добавляет в начало
objName <- ...
чтобы его можно было легко скопировать + вставить, но ... - Если вы работаете на Mac, вывод автоматически копируется в буфер обмена, так что вы можете просто запустить его и вставить в свой вопрос.
Источник доступен здесь:
Пример:
# sample data
DF <- data.frame(id=rep(LETTERS, each=4)[1:100], replicate(100, sample(1001, 100)), Class=sample(c("Yes", "No"), 100, TRUE))
DF составляет около 100 х 102. Я хочу попробовать 10 строк и несколько конкретных столбцов
reproduce(DF, cols=c("id", "X1", "X73", "Class")) # I could also specify the column number.
Дает следующий вывод:
This is what the sample looks like:
id X1 X73 Class
1 A 266 960 Yes
2 A 373 315 No Notice the selection split
3 A 573 208 No (which can be turned off)
4 A 907 850 Yes
5 B 202 46 Yes
6 B 895 969 Yes <~~~ 70 % of selection is from the top rows
7 B 940 928 No
98 Y 371 171 Yes
99 Y 733 364 Yes <~~~ 30 % of selection is from the bottom rows.
100 Y 546 641 No
==X==============================================================X==
Copy+Paste this part. (If on a Mac, it is already copied!)
==X==============================================================X==
DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L, 25L, 25L), .Label = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"), class = "factor"), X1 = c(266L, 373L, 573L, 907L, 202L, 895L, 940L, 371L, 733L, 546L), X73 = c(960L, 315L, 208L, 850L, 46L, 969L, 928L, 171L, 364L, 641L), Class = structure(c(2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L), .Label = c("No", "Yes"), class = "factor")), .Names = c("id", "X1", "X73", "Class"), class = "data.frame", row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L))
==X==============================================================X==
Обратите также внимание на то, что весь вывод находится в хорошей единственной длинной строке, а не в высоком абзаце разделенных строк. Это облегчает чтение сообщений SO с вопросами, а также позволяет легче копировать и вставлять.
Обновление октябрь 2013:
Теперь вы можете указать, сколько строк текста будет занимать (то есть, что вы будете вставлять в ).
Используйте аргумент
lines.out=n
для этого.
Пример:
reproduce(DF, cols=c(1:3, 17, 23), lines.out=7)
приводит к:
==X==============================================================X==
Copy+Paste this part. (If on a Mac, it is already copied!)
==X==============================================================X==
DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L,25L, 25L), .Label
= c("A", "B", "C", "D", "E", "F", "G", "H","I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V", "W", "X", "Y"), class = "factor"),
X1 = c(809L, 81L, 862L,747L, 224L, 721L, 310L, 53L, 853L, 642L),
X2 = c(926L, 409L,825L, 702L, 803L, 63L, 319L, 941L, 598L, 830L),
X16 = c(447L,164L, 8L, 775L, 471L, 196L, 30L, 420L, 47L, 327L),
X22 = c(335L,164L, 503L, 407L, 662L, 139L, 111L, 721L, 340L, 178L)), .Names = c("id","X1",
"X2", "X16", "X22"), class = "data.frame", row.names = c(1L,2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L))
==X==============================================================X==
Вот хорошее руководство:
http://www.r-bloggers.com/three-tips-for-posting-good-questions-to-r-help-and-stack-overflow/
Но самое важное: просто убедитесь, что вы создали небольшой фрагмент кода, который мы можем запустить, чтобы увидеть, в чем проблема.
Полезной функцией для этого является
dput()
, но если у вас очень большие данные, вы можете создать небольшой набор данных или использовать только первые 10 строк или около того.
РЕДАКТИРОВАТЬ:
Также убедитесь, что вы сами определили, где проблема.
Примером не должен быть весь R-скрипт с «В строке 200 есть ошибка».
Если вы используете инструменты отладки в R (я люблю
browser()
) и google, вы сможете действительно определить, где проблема, и воспроизвести тривиальный пример, в котором то же самое происходит не так.
Если у вас есть большой набор данных, который не может быть легко помещен в сценарий с помощью
dput()
,
dput()
свои данные в
pastebin
и загрузите их, используя
read.table
:
d <- read.table("http://pastebin.com/raw.php?i=m1ZJuKLH")
Вдохновленный @Henrik .
Иногда проблема на самом деле не воспроизводима с небольшим фрагментом данных, независимо от того, как сильно вы пытаетесь, и не возникает с синтетическими данными (хотя полезно показать, как вы создали синтетические наборы данных, которые не воспроизводили проблему, потому что это исключает некоторые гипотезы).
- Публикация данных в Интернете где-то и предоставление URL может быть необходимым.
- Если данные не могут быть предоставлены широкой публике, но могут быть переданы вообще, то вы можете предложить по электронной почте заинтересованным сторонам (хотя это сократит количество людей, которые потрудятся работать в теме).
- На самом деле я не видел, чтобы это было сделано, потому что люди, которые не могут выпустить свои данные, чувствительны к тому, чтобы выпустить их в любой форме, но кажется вероятным, что в некоторых случаях все еще можно публиковать данные, если они были достаточно анонимными / скремблированными / слегка поврежденными. каким-то образом.
Если вы не можете сделать ни то, ни другое, вам, вероятно, нужно нанять консультанта, чтобы решить вашу проблему ...
редактировать : два полезных вопроса для анонимизации / шифрования:
Интересно, может ли ссылка http://old.r-fiddle.org/ быть очень аккуратным способом поделиться проблемой. Он получает уникальный идентификатор типа, и можно даже подумать о встраивании его в SO.
Начиная с R.2.14 (я полагаю), вы можете передать свое текстовое представление данных непосредственно в read.table:
df <- read.table(header=T, text="Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
")
Ответы до сих пор явно хороши для воспроизводимости. Это просто для того, чтобы прояснить, что воспроизводимый пример не может и не должен быть единственным компонентом вопроса. Не забудьте объяснить, как вы хотите, чтобы он выглядел, и контуры вашей проблемы, а не только то, как вы пытались добраться до сих пор. Код не достаточно; тебе тоже нужны слова.
Вот воспроизводимый пример того, чего следует избегать (взятый из реального примера, имена изменены, чтобы защитить невинных):
Ниже приведены примеры данных и часть функций, с которыми у меня возникли проблемы.
code
code
code
code
code (40 or so lines of it)
Как мне этого добиться?
У меня есть очень простой и эффективный способ сделать R пример, который не был упомянут выше. Вы можете определить свою структуру в первую очередь. Например,
mydata <- data.frame(a=character(0), b=numeric(0), c=numeric(0), d=numeric(0))
>fix(mydata)
Затем вы можете ввести свои данные вручную. Это эффективно для небольших примеров, а не для больших.
Часто вам нужны некоторые данные для примера, однако вы не хотите публиковать свои точные данные. Чтобы использовать какой-то существующий data.frame в установленной библиотеке, используйте команду data для его импорта.
например,
data(mtcars)
а затем сделать проблему
names(mtcars)
your problem demostrated on the mtcars data set
Я разрабатываю
пакет
wakefield
для решения этой проблемы, чтобы быстро обмениваться воспроизводимыми данными, иногда
dput
отлично работает для небольших наборов данных, но многие проблемы, с которыми мы сталкиваемся, гораздо больше, совместное использование такого большого набора данных через
dput
нецелесообразно.
Около:
wakefield
позволяет пользователю обмениваться минимальным кодом для воспроизведения данных.
Пользователь задает
n
(количество строк) и задает любое количество предустановленных переменных функций (в настоящее время их 70), которые имитируют реальные данные (такие как пол, возраст, доход и т. Д.)
Монтаж:
В настоящее время (2015-06-11) wakefield является пакетом GitHub, но в конце концов перейдет в CRAN после написания модульных тестов. Для быстрой установки используйте:
if (!require("pacman")) install.packages("pacman")
pacman::p_load_gh("trinker/wakefield")
Пример:
Вот пример:
r_data_frame(
n = 500,
id,
race,
age,
sex,
hour,
iq,
height,
died
)
Это производит:
ID Race Age Sex Hour IQ Height Died
1 001 White 33 Male 00:00:00 104 74 TRUE
2 002 White 24 Male 00:00:00 78 69 FALSE
3 003 Asian 34 Female 00:00:00 113 66 TRUE
4 004 White 22 Male 00:00:00 124 73 TRUE
5 005 White 25 Female 00:00:00 95 72 TRUE
6 006 White 26 Female 00:00:00 104 69 TRUE
7 007 Black 30 Female 00:00:00 111 71 FALSE
8 008 Black 29 Female 00:00:00 100 64 TRUE
9 009 Asian 25 Male 00:30:00 106 70 FALSE
10 010 White 27 Male 00:30:00 121 68 FALSE
.. ... ... ... ... ... ... ... ...
Минимальный воспроизводимый пример состоит из следующих элементов:
- минимальный набор данных, необходимый для воспроизведения ошибки
- минимальный исполняемый код, необходимый для воспроизведения ошибки, который может быть запущен для данного набора данных.
- необходимая информация об используемых пакетах, версии R и системе, в которой она запущена.
-
в случае случайных процессов, семя (устанавливается
set.seed()
) для воспроизводимости
Важное примечание: вывод
set.seed()
отличается между R> 3.6.0 и предыдущими версиями.
Укажите, какую версию R вы использовали для случайного процесса.
Глядя на примеры в файлах справки используемых функций, часто бывает полезно. В общем, весь приведенный там код отвечает требованиям минимального воспроизводимого примера: данные предоставляются, минимальный код предоставляется, и все работает.
Создание минимального набора данных
В большинстве случаев это легко сделать, просто предоставив вектор / фрейм данных с некоторыми значениями.
Или вы можете использовать один из встроенных наборов данных, которые поставляются с большинством пакетов.
Полный список встроенных наборов данных можно увидеть в
library(help = "datasets")
.
Существует краткое описание каждого набора данных, и дополнительную информацию можно получить, например, с помощью
?mtcars
где «mtcars» является одним из наборов данных в списке.
Другие пакеты могут содержать дополнительные наборы данных.
Сделать вектор легко.
Иногда необходимо добавить некоторую случайность, и для этого есть целый ряд функций.
sample()
может рандомизировать вектор или дать случайный вектор только с несколькими значениями.
letters
- это полезный вектор, содержащий алфавит.
Это может быть использовано для создания факторов.
Несколько примеров:
-
случайные значения:
x <- rnorm(10)
для нормального распределения,x <- runif(10)
для равномерного распределения, ... -
перестановка некоторых значений:
x <- sample(1:10)
для вектора 1:10 в случайном порядке. -
случайный фактор:
x <- sample(letters[1:4], 20, replace = TRUE)
Для матриц можно использовать
matrix()
, например:
matrix(1:10, ncol = 2)
Создание фреймов данных может быть сделано с помощью
data.frame()
.
Следует обратить внимание на имена записей во фрейме данных и не усложнять их.
Пример :
set.seed(1)
Data <- data.frame(
X = sample(1:10),
Y = sample(c("yes", "no"), 10, replace = TRUE)
)
Для некоторых вопросов могут потребоваться определенные форматы.
Для этого можно использовать любую из предоставленных функций
as.someType
:
as.factor
,
as.Date
,
as.xts
, ... Они в сочетании с приемами векторного и / или фрейма данных.
Скопируйте ваши данные
Если у вас есть некоторые данные, которые было бы слишком сложно построить с помощью этих советов, то вы всегда можете сделать подмножество ваших исходных данных, используя, например,
head()
,
subset()
или индексы.
Тогда используйте например.
dput()
чтобы дать нам что-то, что можно сразу поместить в R:
> dput(head(iris,4))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5,
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2,
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = c("setosa",
"versicolor", "virginica"), class = "factor")), .Names = c("Sepal.Length",
"Sepal.Width", "Petal.Length", "Petal.Width", "Species"), row.names = c(NA,
4L), class = "data.frame")
Если у вашего фрейма данных есть фактор с множеством уровней, вывод
dput
может быть громоздким, поскольку он по-прежнему будет перечислять все возможные уровни факторов, даже если их нет в подмножестве ваших данных.
Чтобы решить эту проблему, вы можете использовать
droplevels()
.
Ниже обратите внимание, как вид является фактором только с одним уровнем:
> dput(droplevels(head(iris, 4)))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5,
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2,
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = "setosa",
class = "factor")), .Names = c("Sepal.Length", "Sepal.Width",
"Petal.Length", "Petal.Width", "Species"), row.names = c(NA,
4L), class = "data.frame")
Еще одно предостережение для
dput
заключается в том, что он не будет работать для объектов
data.table
или для сгруппированных
tbl_df
(класс
grouped_df
) из
dplyr
.
В этих случаях вы можете преобразовать обратно в обычный фрейм данных перед совместным использованием
dput(as.data.frame(my_data))
.
В худшем случае вы можете дать текстовое представление, которое можно прочитать, используя
text
параметр
read.table
:
zz <- "Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa"
Data <- read.table(text=zz, header = TRUE)
Создание минимального кода
Это должно быть легкой частью, но часто это не так. Что вы не должны делать, это:
- добавить все виды преобразований данных. Убедитесь, что предоставленные данные уже в правильном формате (если, конечно, это не проблема)
- Скопируйте и вставьте целую функцию / кусок кода, который выдает ошибку. Во-первых, попытайтесь определить, какие именно строки приводят к ошибке. Чаще всего вы сами узнаете, в чем проблема.
Что вы должны сделать, это:
-
добавьте, какие пакеты следует использовать, если вы их используете (используя
library()
) -
если вы открываете соединения или создаете файлы, добавьте некоторый код, чтобы закрыть их или удалить файлы (используя
unlink()
) -
если вы изменяете параметры, убедитесь, что в коде есть инструкция, чтобы вернуть их обратно к исходным.
(например,
op <- par(mfrow=c(1,2)) ...some code... par(op)
) - Запустите ваш код в новом пустом R-сеансе, чтобы убедиться, что код работает. Люди должны иметь возможность просто скопировать и вставить ваши данные и ваш код в консоль и получить точно такое же, как у вас.
Дать дополнительную информацию
В большинстве случаев достаточно только версии R и операционной системы.
Когда возникают конфликты с пакетами, предоставление вывода
sessionInfo()
может действительно помочь.
Говоря о соединениях с другими приложениями (будь то через ODBC или что-то еще), следует также указать номера версий для них и, если возможно, необходимую информацию о настройке.
Если вы запускаете R в
R Studio
с помощью
rstudioapi::versionInfo()
может быть полезно сообщить о вашей версии RStudio.
Если у вас есть проблема с конкретным пакетом, вы можете
packageVersion("name of the package")
версию пакета,
packageVersion("name of the package")
выходную информацию
packageVersion("name of the package")
.