是否有一种或多种方法可以锁定或保护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
。如果需要的话,我会走这条路(我的桌子足够小,以至于时间/内存开销不会被注意到),但我希望这是一个更自然的解决方案。
答案 0 :(得分:4)
以下是一些可能的想法。
您可以编写自己的包装器对象(可能使用R6包)来定义所有编辑工具以提供错误而不更改底层data.table,但使用标准data.table访问功能来读取对象
您可以按照TeachingDemos包中petals
函数的方法进行操作。
以上两点都不完美,坚定的人仍然可以改变它们。他们可能也不值得所需的工作。
每次运行函数时都可以重新读取表格,因此需要在磁盘上进行更改,而不仅仅是在R中。
有计算MD5sums之类的工具/包,所以你可以为你的data.table计算,然后当代码运行时你可以检查MD5sum并停止它是否已经改变。
您可以将data.tables保存在.Rdata样式文件中,并将该文件附加到搜索路径中,而不是将其加载到工作目录中。它仍然可以更改,但不太可能偶然发生,需要更多努力才能更改(确保您的代码不会访问全局环境中的本地副本(使用get
或::
或检查本地副本不存在))。