在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
在与同事讨论绩效、教学、发送错误报告或搜索邮件列表和Stack Overflow上的指导时,经常会询问一个可重复的示例,并且总是很有用。
你有什么建议来创建一个优秀的例子?如何以文本格式粘贴r中的数据结构?您还应包括哪些其他信息?
除了使用dput()、dump()或structure()之外,还有其他技巧吗?什么时候应该包含library()或require()语句?除了c、df、data等之外,应该避免哪些保留字。?
如何做出一个伟大的、可重复的例子?
当前回答
就我个人而言,我更喜欢“一”行。大致如下:
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))
如果通过光栅包处理空间数据,则可以生成一些随机数据。在包装小插曲中可以找到很多例子,但这里有一个小亮点。
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中实现的空间对象,可以通过“空间”包中的外部文件(如ESRI shapefile)获取一些数据集(请参见任务视图中的空间视图)。
library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")
其他回答
就我个人而言,我更喜欢“一”行。大致如下:
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))
如果通过光栅包处理空间数据,则可以生成一些随机数据。在包装小插曲中可以找到很多例子,但这里有一个小亮点。
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中实现的空间对象,可以通过“空间”包中的外部文件(如ESRI shapefile)获取一些数据集(请参见任务视图中的空间视图)。
library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")
到目前为止,对于再现性部分,答案显然很好。这只是为了澄清,一个可复制的例子不能也不应该是问题的唯一组成部分。别忘了解释你希望它看起来是什么样子,以及你的问题的轮廓,而不仅仅是你迄今为止试图达到的目的。代码不够;你也需要语言。
这里有一个可重复的例子来说明应该避免做什么(从一个真实的例子中得出,为了保护无辜者而改变了名字):
以下是示例数据和我遇到问题的部分函数。
code
code
code
code
code (40 or so lines of it)
我怎样才能做到这一点?
要快速创建数据的dput,只需将数据复制到剪贴板,然后在R中运行以下命令:
对于Excel中的数据:
dput(read.table("clipboard", sep="\t", header=TRUE))
对于.txt文件中的数据:
dput(read.table("clipboard", sep="", header=TRUE))
如果需要,可以更改后者中的sep。当然,只有当您的数据在剪贴板中时,这才有效。
最初的帖子指的是现已退役的数据营的小提琴演奏服务。它已被重新命名为数据营灯,不能像我的回答所示的那样容易嵌入。
我想知道http://old.r-fiddle.org/链接可能是分享问题的一种非常简单的方式。它接收一个唯一的ID,比如,甚至可以考虑将其嵌入SO中。
R-help邮件列表有一个发布指南,包括提问和回答问题,包括生成数据的示例:
示例:有时提供一个小例子实际上可以运行。例如:如果我有如下矩阵x:
> 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
>
如何将其转换为数据帧具有8行和3列“row”、“col”和“value”,它们具有维度名称为“row”和“col”的值,如下所示:
> x.df
row col value
1 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")
)
“小”这个词特别重要。您应该以最小的可重复示例为目标,这意味着数据和代码应该尽可能简单地解释问题。
编辑:漂亮的代码比难看的代码更容易阅读。使用样式指南。