【问题标题】:Can I load an RData file while bypassing loading the namespaces?我可以在绕过加载命名空间的同时加载 RData 文件吗?
【发布时间】:2013-06-26 19:34:36
【问题描述】:
假设我的一些用户无法更改他们的 R 环境,但我需要他们能够打开 RData 文件。这些环境文件需要加载一个包(确切地说是 httpuv)。我们不关心包,我们不需要它的功能,我们只需要获取数据。有没有办法在加载 RData 文件时强制 R 绕过加载命名空间,或者强制它在原始端不依赖命名空间的情况下保存它?谢谢。
要重现,请安装 Shiny。从 Shiny 小程序中创建一些 R 对象并将其作为 RData 文件保存到服务器的文件系统。将文件复制到没有安装 Shiny 或 httpuv 包的计算机上。尝试加载 RData 文件,即使您保存的实际对象完全是与 Shiny 或 httpuv 无关的普通 data.frames。
我在 RData 上做了strings,该死的东西充满了对 httpuv 的引用。该软件正在加载文件,然后主动决定不继续内部loadFromConn2() 功能。因此必须有办法让它停止这样做。
【问题讨论】:
标签:
r
security
namespaces
data-formats
rdata
【解决方案1】:
真的,@baptiste 应该在他的评论中获得一些通用解决方案的链接,尤其是 R CMD INSTALL --fake 技巧,如果他将其重新发布为答案,我会接受。这就是为什么我不接受我自己对在我的案例中导致它的特定问题的以下答案,但我发布我的答案以防它帮助其他人。
我保存的一些对象是lm 合适的对象。那些包含公式/术语对象(每个至少两个,出于某种原因......也许是因为他们已经通过stepAIC),而这些公式又每个都有一个环境属性。环境属性是.GlobalEnv,它可能确实包含某个地方的包函数的副本。当我挖掘拟合模型内的对象,然后是这些对象的所有属性内的对象,然后是这些对象的属性的属性内的对象......并将我能找到的每个环境属性设置为 NULL,最终,我能够将该拟合模型保存到一个文件中,该文件可以从不同的 R 安装打开,而不会出现无法加载命名空间的错误。
我想我也可以编写一个函数来遍历拟合模型中的对象及其属性,并删除环境,但这听起来既丑陋又危险。也许有一种方法可以强制公式和拟合模型不保留环境,这样会更好。目前,我不会保存拟合模型,而是在清除可能在那里找到的任何环境属性后保存它们的调用属性。如果这不起作用,我会将它们分解为字符串。
PS:我用的是RDS格式,还没有用RData测试过,但是我怀疑问题出在某些属性中保存了评估环境,与保存的格式无关对象被保存。如果事实证明这不适用于 RData,我将发布更新。
PPS:我怀疑我不是这里唯一一个第一次听说R CMD INSTALL --fake 技巧的人,也许这个词应该传播开来......因为在某种程度上其他 R 用户没有知道这一点,这仍然是针对 R 的拒绝服务攻击的明显载体!
我将接受我自己的答案以摆脱 SO 自动唠叨,但如果他们通过将其发布为答案使我有可能这样做,我将不接受它并接受 @baptiste。谢谢。