在 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
或 ::
或检查本地副本不存在))。
是否有一种或多种方法可以锁定或保护 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
或 ::
或检查本地副本不存在))。