如何制作一个出色的 R 可重现示例

如何解决如何制作一个出色的 R 可重现示例

基本上,一个应该能够让其他人在他们的机器上准确地重现您的问题。

MRE 由以下项目组成:

  • 一个,是证明问题所必需的
  • 重现错误所需的
  • 有关使用的软件包、R 版本和运行它的操作系统的所有
  • 在随机过程的情况下,可重复性的(由 设置)set.seed()

有关良好 MRE 的示例,请参阅您正在使用的函数的帮助文件底部的“示例”部分。只需在 R 控制台中输入 eghelp(mean)或 short即可。?mean

提供最小数据集

通常,不需要共享庞大的数据集,而且可能会阻止其他人阅读您的问题。因此,最好使用内置数据集或创建一个类似于您的原始数据的小型“玩具”示例,这实际上是最小的意思。如果出于某种原因您确实需要共享您的原始数据,您应该使用一种方法,例如dput(),允许其他人获取您的数据的精确副本。

内置数据集

您可以使用其中一种内置数据集。可以使用 来查看内置数据集的完整列表data()。每个数据集都有一个简短的描述,并且可以获得更多信息,例如使用?irisR 附带的“iris”数据集。安装的包可能包含其他数据集。

创建示例数据集

初步说明:有时您可能需要特殊格式(即类),例如因子、日期或时间序列。对于这些,请使用以下功能:as.factor, as.Date, as.xts, …示例:

d <- as.Date("2020-12-30")

在哪里

class(d)
# [1] "Date"

x <- rnorm(10)  ## random vector normal distributed
x <- runif(10)  ## random vector uniformly distributed    
x <- sample(1:100, 10)  ## 10 random draws out of 1, 2, ..., 100    
x <- sample(LETTERS, 10)  ## 10 random draws out of built-in latin alphabet

m <- matrix(1:12, 3, 4, dimnames=list(LETTERS[1:3], LETTERS[1:4]))
m
#   A B C  D
# A 1 4 7 10
# B 2 5 8 11
# C 3 6 9 12

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=rnorm(n))
dat
#   id       date group age   type         x
# 1  1 2020-12-26     A  27 type 1 0.0356312
# 2  2 2020-12-27     B  19 type 2 1.3149588
# 3  3 2020-12-28     A  20 type 3 0.9781675
# 4  4 2020-12-29     B  26 type 4 0.8817912
# 5  5 2020-12-30     A  26 type 5 0.4822047
# 6  6 2020-12-31     B  28 type 6 0.9657529

虽然它被广泛使用,但最好不要命名您的数据框df,因为df()它是 F 分布的密度(即曲线在点的高度)的 R 函数,x您可能会与它发生冲突。

复制原始数据

如果您有特定原因,或者数据很难从中构建示例,您可以提供原始数据的一小部分,最好使用dput.

dput抛出在控制台上准确再现数据所需的所有信息。您可以简单地复制输出并将其粘贴到您的问题中。

如果您在问题中共享,调用dat(从上面)产生的输出仍然缺少有关变量类和其他功能的信息。此外,列中的空格type使得它很难做任何事情。即使我们开始使用这些数据,我们也无法正确获取您数据的重要特征。

  id       date group age   type         x
1  1 2020-12-26     A  27 type 1 0.0356312
2  2 2020-12-27     B  19 type 2 1.3149588
3  3 2020-12-28     A  20 type 3 0.9781675

Tho 共享子集、使用head()subset()索引iris[1:4, ]。然后把它包装进去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")), row.names = c(NA, 
4L), class = "data.frame")

使用时dput,您可能还希望仅包含相关列,例如 dput(mtcars[1:3, c(2, 5, 6)])

如果您的数据框有一个包含多个级别的因子,则dput输出可能会很笨拙,因为它仍会列出所有可能的因子级别,即使它们不存在于您的数据子集中。要解决此问题,您可以使用该droplevels()功能。请注意下面的物种是如何只有一个水平的因素,例如dput(droplevels(iris[1:4, ]))。另一个需要注意的是,dput它不适用于键控data.table对象tbl_dfgrouped_df. tidyverse在这些情况下,您可以在共享之前转换回常规数据框,dput(as.data.frame(my_data)).

生成最少的代码

结合最少的数据(见上文),您的代码应该通过简单地复制和粘贴来准确地在另一台机器上重现问题。

这应该是容易的部分,但通常不是。你不应该做的事情:

  • 显示各种数据转换;确保提供的数据已经采用正确的格式(当然,除非这是问题所在)
  • 复制粘贴在某处出现错误的整个脚本。尝试找出导致错误的确切行。很多时候,你会发现问题出在自己身上。

你应该做什么:

  • 如果您使用任何软件包,请添加您使用的软件包(使用library()
  • test 在新的 R 会话中运行您的代码,以确保代码可运行。人们应该能够在控制台中复制粘贴您的数据和代码并获得与您相同的内容。
  • 如果您打开连接或创建文件,请添加一些代码以关闭它们或删除文件(使用unlink()
  • 如果您更改选项,请确保代码包含将它们恢复为原始选项的语句。(例如op <- par(mfrow=c(1,2)) ...some code... par(op)

提供必要的信息

在大多数情况下,只需 R 版本和操作系统就足够了。当与包发生冲突时,提供 的输出sessionInfo()真的很有帮助。在谈论与其他应用程序的连接(通过 ODBC 或其他任何方式)时,还应提供这些应用程序的版本号,如果可能,还应提供有关设置的必要信息。

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

如果您对特定包有问题,您可能希望通过提供packageVersion("name of the package").

Seed

使用set.seed()您可以指定seed1,即特定状态,R 的随机数生成器是固定的。这使得随机函数(例如sample()、和许多其他函数rnorm()runif()始终返回相同的结果成为可能,例如:

set.seed(42)
rnorm(3)
# [1]  1.3709584 -0.5646982  0.3631284

set.seed(42)
rnorm(3)
# [1]  1.3709584 -0.5646982  0.3631284

1 R >3.6.0 和以前的版本之间的输出不同。指定您用于随机过程的 R 版本,如果您在回答旧问题时得到的结果略有不同,请不要感到惊讶。要在这种情况下获得相同的结果,您可以在之前使用 -function (例如:) 。 set.seed()``RNGversion()``set.seed()``RNGversion("3.5.2")

解决方法

你对创建一个优秀的例子有什么建议?你如何粘贴数据结构r以文本格式?您还应该包括哪些其他信息?

除了使用dput(),dump()还有其他技巧structure()吗?什么时候应该包含library()orrequire()语句?除了c,df,data等之外,还应该避免哪些保留字?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-