锁定或保护R中的data.table

Cla*_*nJY 6 r data.table

是否有一种或多种方法可以锁定或保护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在函数中根据需要复制+转换.如果需要的话,我会走这条路(我的桌子足够小,不会注意到时间/内存开销),但我希望有一个更自然的解决方案.

Gre*_*now 4

这里有一些可能的想法。

您可以编写自己的包装对象(可能使用 R6 包),该对象定义所有编辑工具以给出错误并且不更改底层 data.table,而是使用标准 data.table 访问功能来读取对象。

您可以按照petalsTeachingDemos包中的函数的方法进行操作。

以上两者都不是完美的,有决心的人仍然可以改变它们。他们可能也不值得做所需的工作。

您可以在每次函数运行时重新读取表,因此需要在磁盘上进行更改,而不仅仅是在 R 中。

有一些工具/包可以计算 MD5sum 之类的东西,因此您可以为 data.table 计算它,然后当代码运行时您可以检查 MD5sum 并在它发生变化时停止。

您可以将 data.tables 保存在 .Rdata 样式文件中,并将该文件附加到搜索路径,而不是将其加载到工作目录中。它仍然可以更改,但不太可能偶然发生,并且需要更多的努力来更改(确保您的代码不会访问全局环境中的本地副本(使用get::或检查本地副本不存在))。