我担心将来运行的代码可能会失败。我见过这个tidyverse
运行良好但一段时间后返回错误的函数,因为它们已被Defunct https://stackoverflow.com/a/5963610/11359310。要给出一些可重现的示例,请尝试这段代码如何制作一个出色的 R 可重现示例 https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610具有讽刺意味的是,这不再是可重现的(比较age
and x
到原来的帖子):
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 29 type 1 0.63286260
2 2 2020-12-27 B 30 type 2 0.40426832
3 3 2020-12-28 A 21 type 3 -0.10612452
4 4 2020-12-29 B 28 type 4 1.51152200
5 5 2020-12-30 A 26 type 5 -0.09465904
6 6 2020-12-31 B 24 type 6 2.01842371
Question
Is it only更新后,相同的代码会返回不同的输出吗?换句话说:包和R
它本身通常不会自动更新,那么这是否意味着只要我不手动更新任何内容,我就可以“永恒”地重新运行某个函数?有什么例外吗?
我为什么问
我使用以下方法为我的公司加密敏感数据bcrypt
封装在R
。我们需要加密数据and删除原始数据。一旦完成,就没有回头路,也就是说,我真的必须信任代码。我没有使用任何包,但是bcrypt
, shiny
and shinydashboard
.
Edit
我的问题假设代码在同一系统上运行,而不更改全局设置(在 @qdread 的评论后编辑),并且不更改 R 版本。
我的具体工作:我处理患者数据。首先,我为每个患者选择一个由字母和数字组成的随机 ID,例如A72CV
for Max Cooper 1987-05-03
。在下一步中我使用bcrypt
为每个患者创建盐,然后使用盐创建 ID 的哈希/加密版本(盐 + ID = 加密 ID)。因此,每个患者都有姓名+出生日期、随机字母/数字 ID、盐(使用生成)salt <- bcrypt::gensalt(log_rounds = 12)
)和加密的 ID(使用生成id_encrypted <- bcrypt::hashpw(id, salt = salt)
)。我将数据保存在三个独立的文件中:(i) 患者数据,即姓名和出生日期以及加密的 ID,(ii) ID 和盐,以及 (iii) 包含 ID 和许多感兴趣变量的实际数据库,例如吸烟者/体重,...这种方法是由一些机构在我工作的环境中推荐的,称为假名化(可逆加密)。它确保即使存在数据泄漏,识别变量名称+生日和所有感兴趣的变量(吸烟者,...)之间也没有明显的联系。我制作了一个闪亮的应用程序,允许我的同事 (1) 提供 ID 并查找姓名 + 出生日期,(2) 提供姓名 + 出生日期并查找 ID,(3) 为新患者生成 ID。这一切都有效,因为具有相同盐的相同 ID 会产生相同的加密(散列)ID - 至少目前是这样。但是,如果将来由于某种原因相同的输入(例如 ID)不会返回相同的输出(例如姓名+出生日期),我就完全搞砸了。另一方面,如果随机 ID 的生成会随着时间的推移而改变,这也不是一个大问题,因为每个 ID 仅创建和保存一次,即该过程不必是可重复的。所描述的加密方法将应用于我的机构花费多年时间收集的一些数据库。如果我们无法重新创建数据,那么一切都会丢失。这就是为什么代码稳定性对我如此重要。我会在我同事的windows电脑上安装shinyApp。他们只会打run App
inside R
然后执行之前描述的选项之一(1 至 3)。