为了账号安全,请及时绑定邮箱和手机立即绑定

如何制作一个很好的R可重复的例子

/ 猿问

如何制作一个很好的R可重复的例子

尚方宝剑之说 2019-07-23 10:29:04

如何制作一个很好的R可重复的例子

在与同事讨论性能,教学,发送错误报告或在邮件列表上搜索指导时,以及在Stack Overflow上,通常会询问可重复的示例并始终提供帮助。

您有什么建议创建优秀示例的提示?如何以文本格式粘贴r中的数据结构?您还应该包含哪些其他信息?

在另外还有其他招数来使用dput()dump()structure()?你什么时候应该包括library()require()声明?其中保留字应避免一个,此外cdfdata等?

怎样才能成为一位伟大的[R重复的例子?


查看完整描述

3 回答

?
汪汪一只猫

一个最小的可重复的例子包括以下项目:

  • 重现错误所必需的最小数据集

  • 重现错误所需的最小可运行代码,可以在给定数据集上运行。

  • 有关所使用的软件包,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.factoras.Dateas.xts结合的载体和/或数据帧的技巧,...这些。

复制您的数据

如果你有一些数据,这将是太难使用这些技巧来构建,那么你可以随时让你的原始数据的子集,例如使用head()subset()或索引。然后用eg。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_dfdplyr。在这些情况下,您可以在共享之前转换回常规数据框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还是其他任何应用程序),还应该为这些应用程序提供版本号,如果可能,还应提供有关设置的必要信息。

如果您在运行v [R Studio的使用rstudioapi::versionInfo()可以帮助您的报告版本RStudio。

如果您遇到特定包的问题,可能需要通过提供输出来提供包的版本packageVersion("name of the package")


查看完整回答
反对 回复 2019-07-23
?
慕工程0101907

(这是我对如何写一个可重复的例子的建议。我试图让它变短但很甜)

如何编写可重现的示例。

如果您提供可重现的示例,您最有可能获得R问题的良好帮助。一个可重现的示例允许其他人通过复制和粘贴R代码来重新创建您的问题。

为了使您的示例可重现,您需要包含四件事:所需的包,数据,代码和R环境的描述。

  • 应该在脚本的顶部加载,因此很容易看到示例需要哪些包。

  • 在电子邮件或Stack Overflow问题中包含数据的最简单方法是使用dput()生成R代码来重新创建它。例如,要mtcars在R中重新创建数据集,我将执行以下步骤:

    1. dput(mtcars)在R中运行

    2. 复制输出

    3. 在我可重现的脚本中,键入mtcars <-然后粘贴。

  • 花一点时间确保您的代码易于其他人阅读:

    • 确保你已经使用了空格,你的变量名称简洁,但信息丰富

    • 使用注释来指出问题所在

    • 尽力删除与问题无关的所有内容。
      代码越短,理解起来就越容易。

  • sessionInfo()在代码中包含注释的输出。这总结了您的R环境,并且可以轻松检查您是否使用了过时的软件包。

你可以通过启动一个新的R会话并粘贴你的脚本来检查你是否真的做了一个可重现的例子。

在将所有代码放入电子邮件之前,请考虑将其放在Gist github上。它将为您的代码提供良好的语法突出显示,您不必担心电子邮件系统会破坏任何内容。


查看完整回答
反对 回复 2019-07-23
?
萧十郎

就个人而言,我更喜欢“一个”衬里。一些事情:

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,则可以通过“空间”包中的外部文件(如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")


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 83 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信