在 R 中锁定或保护 data.table

Lock or protect a data.table in R

是否有一种或多种方法可以锁定或保护 data.table 以使其无法再就地修改?

假设我们有一个 data.table:

dt <- data.table(id = 1, val="foo")
dt
#    id val
# 1:  1 foo

然后我可以修改 dt 以获得以下行为吗?

dt[, val:="bar"]
# error or warning
dt
#    id val
# 1:  1 foo  ## unmodified

上下文

这是因为我在工作中编写了一个广泛使用 data.table 的小型 R 包。它有一些 data.tables 在里面(翻译表),如果用户不小心修改了,会导致问题(不正确的翻译)。我曾希望制作数据 "internal"(定义为 here)可以解决这个问题,但事实并非如此。

因为这只是 data.table 对象的问题,我可以只使用 data.frames,根据需要在函数内复制 + 转换为 data.table。如果需要,我会走这条路(我的表足够小,不会注意到 time/memory 开销),但我希望有一个更自然的解决方案。

这里有一些可能的想法。

您可以编写自己的包装器对象(可能使用 R6 包)定义所有编辑工具以提供错误并且不更改基础 data.table,但使用标准 data.table 访问仅读取对象的功能。

您可以遵循 TeachingDemos 包中 petals 函数的方法。

以上两个都不完美,有心人还是可以改的。他们可能也不值得为此付出努力。

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

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

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