我是否可以在绕过加载命名空间的同时加载RData文件?

时间:2013-06-28 22:39:59

标签: r security namespaces data-formats rdata

假设我的一些用户无法改变他们的R环境,但我需要它们才能打开RData文件。这些环境文件需要加载包(确切地说是httpuv)。我们不关心包,我们不需要它的功能,我们只需要获取数据。有没有办法在加载RData文件时强制R绕过加载命名空间,或强制它在原始端没有命名空间依赖关系的情况下保存它?感谢。

要重现,请安装Shiny。从Shiny applet中创建一些R对象并将其保存到服务器的文件系统中作为RData文件。将文件复制到没有Shiny或安装了httpuv软件包的计算机上。尝试加载RData文件,即使您保存的实际对象完全是与Shiny或httpuv无关的普通data.frames。

我在RData上做了strings,该死的东西充满了对httpuv的引用。软件正在加载文件,然后主动决定不继续使用内部loadFromConn2()功能。因此必须有办法让它停止这样做。

1 个答案:

答案 0 :(得分:0)

真的@baptiste应该对他对一些常规解决方案的评论中的链接表示赞赏,尤其是R CMD INSTALL --fake技巧,如果他将其作为答案重新发布,我会接受。这就是为什么我不接受我自己的以下答案来解决在我的情况下引起它的具体问题,但我发布了我的答案,以防它帮助其他人。

我保存的一些对象是lm拟合对象。那些包含公式/术语对象(由于某种原因至少两个......可能是因为它们已经通过stepAIC),而这些公式又各自具有环境属性。环境属性是.GlobalEnv,它可能包含某个包函数的副本。当我挖掘拟合模型中的对象,然后在那些对象的所有属性中的对象,然后在那些对象的属性的属性内的对象...并设置每个环境属性,我可以找到NULL,最终我能够将该拟合模型保存到可以从不同的R安装中打开的文件中,而不会收到关于无法加载命名空间的错误。

我想我也可以编写一个函数来迭代拟合模型中的对象及其属性,并删除环境但听起来很丑陋和危险。也许有办法迫使公式和拟合模型不保留环境,这会更好。目前,我不会保存适合的模型,而是在擦除我可能在那里找到的任何环境属性后保存它们的调用属性。如果这不起作用,我会将它们解析为字符串。

PS:我使用RDS格式并且尚未使用RData对其进行测试,但我怀疑问题是在某些属性中保存了评估环境,并且与其中的格式无关对象得到保存。如果事实证明这不适用于RData,我会发布更新。

PPS:我怀疑我不是唯一一个第一次听到R CMD INSTALL --fake伎俩的人,也许这个词应该传播到这个......因为其他R用户都不愿意这样做不知道这一点,这仍然是针对R的拒绝服务攻击的明显载体!


我会接受我自己的答案来摆脱SO自动唠叨,但是如果他们通过将其作为答案发布,我会接受@baptiste。感谢。