是否有一种或多种方法可以锁定或保护data.table它,使其无法再就地修改?
假设我们有一个data.table:
dt <- data.table(id = 1, val="foo")
dt
# id val
# 1: 1 foo
Run Code Online (Sandbox Code Playgroud)
然后我可以修改dt以获得以下行为吗?
dt[, val:="bar"]
# error or warning
dt
# id val
# 1: 1 foo ## unmodified
Run Code Online (Sandbox Code Playgroud)
之所以这样,是因为我在工作中创作了一个data.table广泛使用的小R包.它有一些data.tables(翻译表),如果用户意外修改,将导致问题(不正确的翻译).我曾希望使数据"内部"(定义在这里)会解决这个问题,但事实并非如此.
因为这只是data.table对象的问题,我可以使用data.frames,data.table在函数中根据需要复制+转换.如果需要的话,我会走这条路(我的桌子足够小,不会注意到时间/内存开销),但我希望有一个更自然的解决方案.
这里有一些可能的想法。
您可以编写自己的包装对象(可能使用 R6 包),该对象定义所有编辑工具以给出错误并且不更改底层 data.table,而是使用标准 data.table 访问功能来读取对象。
您可以按照petalsTeachingDemos包中的函数的方法进行操作。
以上两者都不是完美的,有决心的人仍然可以改变它们。他们可能也不值得做所需的工作。
您可以在每次函数运行时重新读取表,因此需要在磁盘上进行更改,而不仅仅是在 R 中。
有一些工具/包可以计算 MD5sum 之类的东西,因此您可以为 data.table 计算它,然后当代码运行时您可以检查 MD5sum 并在它发生变化时停止。
您可以将 data.tables 保存在 .Rdata 样式文件中,并将该文件附加到搜索路径,而不是将其加载到工作目录中。它仍然可以更改,但不太可能偶然发生,并且需要更多的努力来更改(确保您的代码不会访问全局环境中的本地副本(使用get或::或检查本地副本不存在))。