锁定或保护R中的data.table

时间:2015-03-16 19:26:39

标签: r data.table

是否有一种或多种方法可以锁定或保护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

上下文

之所以出现,是因为我在工作中创作了一个小型R包,广泛使用data.table。它中有一些data.tables(翻译表),如果用户意外修改,会导致问题(翻译不当)。我曾希望制作数据&#34;内部&#34; (按照定义here)会解决这个问题,但事实并非如此。

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

1 个答案:

答案 0 :(得分:4)

以下是一些可能的想法。

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

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

以上两点都不完美,坚定的人仍然可以改变它们。他们可能也不值得所需的工作。

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

有计算MD5sums之类的工具/包,所以你可以为你的data.table计算,然后当代码运行时你可以检查MD5sum并停止它是否已经改变。

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