3

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

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

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

4

1 回答 1

0

真的,@baptiste 应该在他的评论中获得一些通用解决方案的链接,尤其是R CMD INSTALL --fake技巧,如果他将其重新发布为答案,我会接受。这就是为什么我不接受我自己对在我的案例中导致它的特定问题的以下答案,但我发布我的答案以防它帮助其他人。

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

我想我也可以编写一个函数来遍历拟合模型中的对象及其属性,并删除环境,但这听起来既丑陋又危险。也许有一种方法可以强制公式和拟合模型不保留环境,这样会更好。目前,我不会保存拟合模型,而是在清除可能在那里找到的任何环境属性后保存它们的调用属性。如果这不起作用,我会将它们分解为字符串。

PS:我用的是RDS格式,还没有用RData测试过,但是我怀疑问题是保存了一些属性中的评估环境,和保存对象的格式无关. 如果事实证明这不适用于 RData,我将发布更新。

PPS:我怀疑我不是这里唯一R CMD INSTALL --fake第一次听说这个把戏的人,也许应该传播这个词......因为在某种程度上其他 R 用户不知道它,这仍然存在一个明显的针对 R 的拒绝服务攻击的载体!


我将接受我自己的答案以摆脱 SO auto-nagger,但如果他们通过将其发布为答案使我有可能这样做,我将不接受它并接受@baptiste。谢谢。

于 2013-07-01T05:04:27.647 回答