如何制作出色的R可重现示例
与同事讨论性能,教学,发送错误报告或在邮件列表以及堆栈溢出此处寻求指导时,经常会问到一个可重复的示例,并且总是很有帮助。
您建立出色范例的秘诀是什么? 如何以文本格式粘贴r中的数据结构? 您还应该包括哪些其他信息?
除了使用dput()
, dump()
或structure()
之外,还有其他技巧吗? 什么时候应该包含library()
或require()
语句? 除了c
, df
, data
等之外,还应避免使用哪些保留字?
怎样才能成为一位伟大的[R重复的例子?
#1楼
从R.2.14开始(我想),您可以将数据文本表示形式直接提供给read.table
:
df <- read.table(header=TRUE, 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
")
#2楼
到目前为止,对于可重复性部分,答案显然是非常好的。 这仅仅是为了阐明可复制的示例不能也不应该成为问题的唯一组成部分。 不要忘了解释您希望它看起来像什么以及问题的轮廓,而不仅仅是解释您到目前为止如何尝试实现。 代码是不够的。 您还需要文字。
以下是可避免的操作的可重现示例(从真实示例中得出,为了保护无辜者,更改了名称):
以下是示例数据和我遇到的部分功能。
code
code
code
code
code (40 or so lines of it)
我该如何实现?
#3楼
通常,您需要一些数据作为示例,但是,您不想发布确切的数据。 要在已建立的库中使用一些现有的data.frame,请使用data命令将其导入。
例如,
data(mtcars)
然后解决问题
names(mtcars)
your problem demostrated on the mtcars data set
#4楼
要快速创建数据dput
,您只需将数据复制(一部分)到剪贴板并在R中运行以下命令:
用于Excel中的数据:
dput(read.table("clipboard",sep="\t",header=TRUE))
用于txt文件中的数据:
dput(read.table("clipboard",sep="",header=TRUE))
您可以根据需要在后者中更改sep
。 当然,这仅在您的数据位于剪贴板中时才有效。
#5楼
受此启发,我现在使用了一个方便的功能
当我需要发布到StackOverflow时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上运行,则输出会自动复制到剪贴板,以便您可以简单地运行它,然后粘贴到您的问题中。
来源在这里可用:
- Github-pubR / reproduce.R
例:
# 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 x102。我想对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年10月更新:
现在,您可以指定要占用多少行文本输出(即,将粘贴到StackOverflow中的内容)。 lines.out=n
请使用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==
#6楼
如果您有无法使用dput()
轻松放入脚本的大型数据集,请将数据发布到pastebin并使用read.table
加载它们:
d <- read.table("http://pastebin.com/raw.php?i=m1ZJuKLH")
受@Henrik启发。
#7楼
我有一个非常简单有效的方法来制作上面没有提到的R示例。 您可以先定义您的结构。 例如,
mydata <- data.frame(a=character(0), b=numeric(0), c=numeric(0), d=numeric(0))>fix(mydata)
然后,您可以手动输入数据。 对于较小的示例而不是较大的示例,这是有效的。
#8楼
可复制的代码是获得帮助的关键。 但是,许多用户可能对粘贴其大部分数据持怀疑态度。 例如,他们可以使用敏感数据或收集的原始数据以供研究论文使用。 出于任何原因,我认为最好有一个方便的功能来在公开粘贴数据之前“变形”我的数据。 软件包SciencesPo
的anonymize
函数非常愚蠢,但对我来说,它与dput
函数配合使用效果很好。
install.packages("SciencesPo")dt <- data.frame(Z = sample(LETTERS,10),X = sample(1:10),Y = sample(c("yes", "no"), 10, replace = TRUE)
)> dtZ X Y
1 D 8 no
2 T 1 yes
3 J 7 no
4 K 6 no
5 U 2 no
6 A 10 yes
7 Y 5 no
8 M 9 yes
9 X 4 yes
10 Z 3 no
然后我将其匿名化:
> anonymize(dt)Z X Y
1 b2 2.5 c1
2 b6 -4.5 c2
3 b3 1.5 c1
4 b4 0.5 c1
5 b7 -3.5 c1
6 b1 4.5 c2
7 b9 -0.5 c1
8 b5 3.5 c2
9 b8 -1.5 c2
10 b10 -2.5 c1
在应用匿名化和dput命令之前,可能还需要采样一些变量而不是整个数据。
# sample two variables without replacement
> anonymize(sample.df(dt,5,vars=c("Y","X")))Y X
1 a1 -0.4
2 a1 0.6
3 a2 -2.4
4 a1 -1.4
5 a2 3.6
#9楼
我想知道http://old.r-fiddle.org/链接是否可以成为一种很好的共享问题的方式。 它收到一个唯一的ID,例如,甚至可以考虑将其嵌入SO。
#10楼
如果您的数据中有一个或多个要使用dput(head(mydata))
重现的factor
变量,请考虑droplevels
添加droplevels
级,以便最小化数据集中不存在的因子水平为为了使示例最少 ,您的dput
输出中未包含该dput
:
dput(droplevels(head(mydata)))
#11楼
指导原则:
编写问题的主要目的应该是使读者尽可能容易地在其系统上理解和重现您的问题。 为此:
- 提供输入数据
- 提供预期的输出
- 简要说明您的问题
- 如果您有超过20行的文字和代码,则可以返回并简化
- 在保留问题/错误的同时尽可能简化代码
这确实需要一些工作,但似乎是一个公平的权衡,因为您正在要求其他人为您工作。
提供数据:
内置数据集
到目前为止 ,最好的选择是依靠内置数据集。 这使得其他人很容易处理您的问题。 在R提示符下键入data()
以查看可用的数据。 一些经典的例子:
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
将数据对象转换为R代码(例如dput(myData)
)。 我说“最后一dput
是因为dput
的输出通常很笨拙,烦人复制粘贴,并且掩盖了其余的问题。
提供预期的输出:
曾经有人说:
预期输出的图片价值1000字
-一个非常聪明的人
如果您可以添加类似“我希望得到此结果”之类的内容:
cyl mean.hp
1: 6 122.28571
2: 4 82.63636
3: 8 209.21429
对于您的问题,人们更有可能快速了解您正在尝试做什么。 如果您的预期结果很大并且很笨拙,那么您可能还没有对如何简化问题进行充分的考虑(请参阅下文)。
简要说明您的问题
主要要做的是在提出问题之前尽可能简化您的问题。 重新构建问题以使用内置数据集将在这方面有很大帮助。 您还会经常发现,仅通过简化过程,您就能解决自己的问题。
以下是一些好问题的示例:
- 内置数据集
- 用户生成的数据
在这两种情况下,几乎可以肯定的是,用户所遇到的问题并不是他们提供的简单示例。 相反,他们抽象了问题的性质,并将其应用于简单的数据集以提出问题。
为什么对这个问题还有另一个答案?
这个答案集中在我认为是最佳实践的方面:使用内置数据集并以最小的形式提供结果。 最突出的答案集中在其他方面。 我不希望这个答案能引起人们的关注。 这仅仅是在这里,以便我可以在对新手问题的评论中链接到它。
#12楼
我正在开发wakefield软件包,以解决快速共享可复制数据的需求,有时dput
对于较小的数据集效果很好,但是我们处理的许多问题都很大,通过dput
共享如此大的数据集是不切实际的。
关于:
akefield允许用户共享最少的代码来重现数据。 用户设置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
.. ... ... ... ... ... ... ... ...
#13楼
这是我的一些建议:
- 尝试使用默认的R数据集
- 如果您有自己的数据集,请将它们包含在
dput
,以便其他人可以更轻松地为您提供帮助 - 除非确实需要,否则不要使用
install.package()
,人们会理解您是否仅使用require
或library
尽量简洁
- 有一些数据集
- 尝试尽可能简单地描述您需要的输出
- 在问问题之前先自己做
- 上载图像很容易,因此如果有,则上载图
- 还包括您可能遇到的任何错误
所有这些都是可复制示例的一部分。
#14楼
除了上述所有我认为非常有趣的答案外,有时在这里讨论也很容易:- 如何制作一个最小的可复制示例以帮助R
创建随机向量的方法有很多, 创建一个100个数字的向量,R中的随机值四舍五入到2位小数 ,R中的随机矩阵
mydf1<- matrix(rnorm(20),nrow=20,ncol=5)
请注意,有时由于各种原因(例如维度等),很难共享给定的数据。但是,当要创建可重现的数据示例时,上述所有答案都是非常重要的,思考和使用非常重要。 但是请注意,为了使数据能代表原始数据(如果OP无法共享原始数据),最好在数据示例中添加一些信息,例如(如果我们将数据称为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))
#15楼
请不要这样粘贴您的控制台输出:
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")))
> xx 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.dfrow 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")
还有一件事,如果您使用了某些软件包中的任何功能,请提及该库。
#16楼
最好使用testthat
包中的函数来显示您期望发生的事情。 因此,其他人可以更改您的代码,直到代码正常运行为止。 这减轻了想要帮助您的人的负担,因为这意味着他们不必解码您的文字描述。 例如
library(testthat)
# code defining x and y
if (y >= 10) {expect_equal(x, 1.23)
} else {expect_equal(x, 3.21)
}
比“我认为x对于y等于或超过10时x等于1.23,否则为3.21清晰,但我没有得到结果”。 即使在这个愚蠢的示例中,我也认为代码比文字更清晰。 使用testthat
可以使您的助手将精力集中在代码上,从而节省时间,并且在他们发布代码之前为他们提供了一种方法,让他们知道他们已经解决了您的问题
#17楼
您可以使用reprex进行此操作。
正如mt1022指出的那样 ,“ ...用于产生最少的,可重复的示例的好的包装是tidyverse的” reprex ”。
根据Tidyverse :
“ reprex”的目标是将您有问题的代码打包为其他人可以运行它并感到您的痛苦。
tidyverse网站上提供了一个示例。
library(reprex)
y <- 1:4
mean(y)
reprex()
我认为这是创建可复制示例的最简单方法 。
#18楼
这是一个很好的指南 。
最重要的一点是: 只需确保您编写一小段代码即可运行以查看问题所在 。 一个有用的函数是dput()
,但是如果您有非常大的数据,则可能要制作一个小的样本数据集或仅使用前10行左右。
编辑:
还要确保您确定问题出在哪里。 该示例不应是带有“在线200处存在错误”的整个R脚本。 如果您使用R(我喜欢browser()
)和Google中的调试工具,则您应该能够真正确定问题出在哪里,并重现一个简单的例子,其中同样的事情出了问题。
#19楼
就个人而言,我更喜欢“一个”衬垫。 大致情况:
my.df <- data.frame(col1 = sample(c(1,2), 10, replace = TRUE),col2 = as.factor(sample(10)), col3 = letters[1:10],col4 = sample(c(TRUE, FALSE), 10, replace = TRUE))
my.list <- list(list1 = my.df, list2 = my.df[3], list3 = letters)
数据结构应该模仿作者问题的概念,而不是精确的逐字记录结构。 当变量不覆盖我自己的变量或禁止使用函数(例如df
)时,我真的很感激。
或者,可以偷偷摸摸地指出一个预先存在的数据集,例如:
library(vegan)
data(varespec)
ord <- metaMDS(varespec)
不要忘记提及您可能正在使用的任何特殊软件包。
如果要在较大的物体上演示某些东西,可以尝试
my.df2 <- data.frame(a = sample(10e6), b = sample(letters, 10e6, replace = TRUE))
如果通过raster
包处理空间数据,则可以生成一些随机数据。 在包装插图中可以找到很多示例,但这是一个小块。
library(raster)
r1 <- r2 <- r3 <- raster(nrow=10, ncol=10)
values(r1) <- runif(ncell(r1))
values(r2) <- runif(ncell(r2))
values(r3) <- runif(ncell(r3))
s <- stack(r1, r2, r3)
如果需要sp
实现的某些空间对象,则可以通过“ spatial”包中的外部文件(例如ESRI shapefile)获得一些数据集(请参阅“任务视图”中的Spatial视图)。
library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")
#20楼
一个最小的可复制示例包括以下各项:
- 最小数据集,对于重现错误是必需的
- 产生错误所需的最小可运行代码,可以在给定数据集上运行该代码。
- 有关所用软件包,R版本和运行它的系统的必要信息。
- 如果是随机过程,则为可重现性提供一个种子(由
set.seed()
设置)
重要说明:R> 3.6.0与以前的版本之间, set.seed()
的输出有所不同。 请指定用于随机过程的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()
或索引来制作原始数据的subset()
。 然后使用dput()
给我们可以立即放入R中的内容:
> dput(iris[1:4, ]) # first four rows of the iris data set
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(iris[1: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
,您可能还希望仅包括相关列:
> dput(mtcars[1:3, c(2, 5, 6)]) # first three rows of columns 2, 5, and 6
structure(list(cyl = c(6, 6, 4), drat = c(3.9, 3.9, 3.85), wt = c(2.62,
2.875, 2.32)), row.names = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710"
), class = "data.frame")
另外一个需要注意的dput
是,它不会对键工作data.table
对象或分组tbl_df
(类grouped_df
从) dplyr
。 在这些情况下,您可以在共享dput(as.data.frame(my_data))
之前转换回常规数据帧。
最坏的情况是,您可以提供一个文本表示形式,可以使用read.table
的text
参数来读取它:
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或其他方式)时,还应提供这些应用程序的版本号,并在可能的情况下还提供有关安装程序的必要信息。
如果使用rstudioapi::versionInfo()
在R Studio中运行R,则有助于报告RStudio版本。
如果您对特定软件包有packageVersion("name of the package")
,则可能需要通过提供packageVersion("name of the package")
的输出来提供软件包的版本。
#21楼
R-help邮件列表的发布指南涵盖了提问和回答问题,包括生成数据的示例:
示例:有时它有助于提供一个可以使某人实际运行的小示例。 例如:
如果我有一个矩阵x,如下所示:
> x <- matrix(1:8, nrow=4, ncol=2,dimnames=list(c("A","B","C","D"), c("x","y"))> xx yA 1 5B 2 6C 3 7D 4 8>
我如何将其转换为具有8行,名为“ row”,“ col”和“ value”的三列的数据框,它们的维名称分别为“ row”和“ col”的值,如下所示:
> x.dfrow col value1 A x 1
...
(答案可能是:
> 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")
)
小这个词特别重要。 您应该以最小的可复制示例为目标,这意味着数据和代码应尽可能简单以解释问题。
编辑:漂亮的代码比丑陋的代码更容易阅读。 使用样式指南 。
#22楼
(这是我从“ 如何编写可重现的示例”中获得的建议 。我试图使它简短但精巧)
如何编写可复制的示例。
如果您提供一个可复制的示例,则很可能会在R问题上获得良好的帮助。 一个可复制的示例允许其他人仅通过复制和粘贴R代码来重新创建您的问题。
要使示例可重现,需要包括四件事:所需的程序包,数据,代码和对R环境的描述。
程序包应加载到脚本的顶部,因此很容易看到示例所需的程序包。
在电子邮件或堆栈溢出问题中包含数据的最简单方法是使用
dput()
生成R代码以重新创建它。 例如,要在R中重新创建mtcars
数据集,我将执行以下步骤:- 在R中运行
dput(mtcars)
- 复制输出
- 在我的可复制脚本中,键入
mtcars <-
然后粘贴。
- 在R中运行
花一点时间来确保您的代码易于他人阅读:
确保您使用了空格,并且变量名简洁明了,但内容丰富
使用注释指示您的问题所在
尽力删除与该问题无关的所有内容。
您的代码越短,越容易理解。
在代码的注释中包含
sessionInfo()
的输出。 这概括了您的R环境 ,并使您可以轻松检查是否使用了过时的软件包。
您可以通过启动一个新的R会话并粘贴您的脚本来检查您是否确实制作了一个可复制的示例。
在将所有代码放入电子邮件之前,请考虑将其放在Gist github上 。 它将为您的代码提供出色的语法高亮显示,并且您不必担心电子邮件系统会干扰任何事情。
#23楼
有时,无论您如何努力,使用较小的数据实际上都无法重现该问题,并且对于合成数据也不会发生此问题(尽管显示如何生成不重现该问题的合成数据集很有用,因为它排除了一些假设)。
- 可能需要将数据发布到某个地方的Web并提供URL。
- 如果这些数据不能公开发布,但可以共享,那么您可以通过电子邮件将其发送给感兴趣的各方(尽管这样可以减少工作人员的数量)在上面)。
- 我实际上还没有看到这样做,因为无法发布数据的人对发布任何形式的数据都很敏感,但是在某些情况下,如果数据被充分匿名/扰乱/损坏,仍然可以发布数据似乎是合理的。某种程度上来说。
如果您不能做任何一个,那么您可能需要聘请顾问来解决您的问题...
编辑 :两个有用的匿名/加扰的问题:
- 如何从私有数据创建示例数据集(用不提供信息的占位符替换变量名称和级别)?
- 给定从连续单变量分布中得出的一组随机数,找到分布
如何制作出色的R可重现示例相关推荐
- 用R做heatmap示例:NBA联盟50位顶级球员的指标表现
用R做heatmap示例:NBA联盟50位顶级球员的指标表现 虽然 heatmap 只是 R 中一个很普通的图形函数,但这个例子使用了2008-2009赛季 NBA 50个顶级球员数据做了一个极佳的演 ...
- R主成分分析PCA示例
R主成分分析PCA示例 目录 R主成分分析PCA示例 主成分分析(Principal components analysis) 加载数据 计算主成分(Principal
- mysql管理应用_如何在PHP和MySQL中制作出色的库存管理应用程序
mysql管理应用 by Richard 理查德(Richard) 如何在PHP和MySQL中制作出色的库存管理应用程序 (How to Make an Awesome Inventory Manag ...
- php表格好看样式,怎么用css制作好看的表格?【示例】
本篇文章将要给大家详细介绍如何用css制作出好看又简洁的HTML表格.相信大家在接触过HTML相关知识后,或多或少都会自己写点小代码,写个小效果.就比如table表格,我们在浏览各个网站时,总能看到各 ...
- 最小的可重现示例Minimal reproducible example
在计算中,一个最小的可重现示例(缩写为MRE)是源代码和其他数据文件的集合,它们允许演示和重现错误或问题.最小可重现示例的重要特征是它尽可能小且尽可能简单,这样就足以证明问题,但没有任何额外的复杂性或 ...
- 如何使用 ChatGPT 制作出色的简历?
您是否厌倦了制作完美的简历,却得不到潜在雇主的回应? 现在是时候转向人工智能和OpenAI开发的工具ChatGPT的力量了. 在本文中,我们将向您展示 ChatGPT 如何彻底改变您的求职并将您的简历 ...
- 网页益智游戏怎么制作_休息一下,或者:如何使用Java 12制作出色的益智游戏...
网页益智游戏怎么制作 Java 12以实验形式提供了switch表达式以及switch和break语句的新形式. 对于可能很少用到的构造,有大量的新语法和语义-当然,对于那些困惑者和认证考试问题的作者 ...
- R 语言柱状图示例笔记
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文章中链接. 一.基础柱状图 1. barplot 命令 基于barplot基础柱状图颜色.方向及分组的绘 ...
- 超图桌面版制作一幅简单专题图示例
打开桌面版本8c,打开自带示例数据源 重庆: 根据数据集 main_road_0 制作一幅地图:此数据集是重庆市主要公路的一部分:制作地图见此: https://blog.csdn.net/bcbob ...
最新文章
- 图片html代码查看器,360度全景商品图片查看器
- 浅析网站优化的站长们应该怎样安排自己的工作内容呢?
- 2021年1月10日停电感慨
- Python列表的增删查改及常用操作
- mysql创建账号并赋予权限
- 时间和空间复杂度概述【Java _demo版】
- html怎么加断点快捷键,HTML添加断点 - osc_vyztkm1b的个人空间 - OSCHINA - 中文开源技术交流社区...
- 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?...
- 织梦CMS调用文章列表时,怎么显示短时间格式
- Java线程局部变量ThreadLocal
- eclipse 快捷键总结
- Collection __NSArrayM: 0xxxxxxx was mutated while being enumerated.
- 谁是杨强?首位AAAI华人主席,身兼5大顶级组织Fellow,也是华为诺亚方舟实验室开创者...
- 错过了多次捞钱的机会
- 【Django 2021年最新版教程17】数据库操作 models 存在更新 不存在新建update_or_create
- VS的一个项目,release/debug/x64/win32的设置有没有办法一次设置?
- 负熵主义者_未来主义者
- Oracle listagg去重distinct三种方法总结
- 收藏!从十篇顶会论文解读计算机视觉的未来之路!
- Lattice的构建过程