如何创建出色的R语言可复现示例

如何创建出色的R语言可复现示例

技术背景

在R语言的使用过程中,当我们遇到问题并寻求帮助时,提供一个可复现的示例能让他人更准确地理解问题并提供有效的解决方案。一个好的可复现示例可以节省大家的时间,提高解决问题的效率。

实现步骤

1. 提供最小数据集

  • 使用内置数据集:可以使用data()查看内置数据集列表,例如irismtcars等。如查看iris数据集信息可使用?iris
  • 创建示例数据集
    • 向量:使用rnorm()runif()sample()等函数创建随机向量。
    1
    2
    3
    4
    x <- rnorm(10)  # 随机正态分布向量
    x <- runif(10) # 随机均匀分布向量
    x <- sample(1:100, 10) # 从1到100中随机抽取10个数字
    x <- sample(LETTERS, 10) # 从大写字母中随机抽取10个
    • 矩阵:使用matrix()函数创建矩阵。
    1
    m <- matrix(1:12, 3, 4, dimnames=list(LETTERS[1:3], LETTERS[1:4]))
    • 数据框:使用data.frame()函数创建数据框,同时可使用set.seed()保证结果可复现。
    1
    2
    3
    4
    5
    6
    7
    8
    set.seed(42)
    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))
  • 复制原始数据:使用dput()函数复制原始数据,也可使用constructive::construct()获得更简洁的输出。
1
2
dput(iris[1:4, ])
constructive::construct(iris[1:4,])

2. 编写最小代码

  • 结合最小数据集,代码应能在其他机器上通过复制粘贴精确复现问题。
  • 避免展示不必要的数据转换,定位导致错误的具体代码行。
  • 添加使用的包(使用library()),在新的R会话中测试代码,确保代码可运行。
  • 若打开连接或创建文件,添加关闭连接或删除文件的代码(使用unlink())。
  • 若更改了选项,添加恢复选项的代码。

3. 提供必要信息

  • 通常提供R版本和操作系统信息即可,包冲突时提供sessionInfo()的输出。
  • 涉及与其他应用程序的连接时,提供相关版本号和设置信息。
  • 在R Studio中运行时,可使用rstudioapi::versionInfo()报告RStudio版本。
  • 特定包有问题时,提供packageVersion("包名")的输出。

4. 设置种子

使用set.seed()指定种子,使随机函数结果可复现。

1
2
set.seed(42)
rnorm(3)

核心代码

创建示例数据框

1
2
3
4
5
6
7
8
set.seed(42)
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))

使用dput()复制数据

1
dput(iris[1:4, ])

使用reprex创建可复现示例

1
2
3
4
library(reprex)
y <- 1:4
mean(y)
reprex()

最佳实践

  • 使用内置数据集,方便他人处理问题。
  • 简化代码,去除与问题无关的部分。
  • 明确问题描述,解释期望输出。
  • 使用代码风格指南,使代码更易读。

常见问题

1. dput输出过长

可使用constructive::construct()获得更简洁的输出,或使用reproduce()函数自动采样大数据集。

2. 数据包含敏感信息

可使用SciencesPo包的anonymize函数对数据进行匿名化处理。

3. 大数据集难以使用dput处理

可将数据发布到pastebin等网站,使用read.table加载。

4. 随机函数结果不一致

使用set.seed()指定种子,同时注意不同R版本set.seed()输出可能不同,可使用RNGversion()函数解决。


如何创建出色的R语言可复现示例
https://119291.xyz/posts/how-to-make-a-great-r-reproducible-example/
作者
ww
发布于
2025年5月14日
许可协议