【发布时间】:2016-09-02 17:19:17
【问题描述】:
rel.mem <- function(nm) {
rm(nm)
}
我定义了上面的函数 rel.mem -- 接受一个参数并将它传递给 rm
> ls()
[1] "rel.mem"
> x<-1:10
> ls()
[1] "rel.mem" "x"
> rel.mem(x)
> ls()
[1] "rel.mem" "x"
现在你可以看到我所说的 rel.mem x 没有被删除——我知道这是由于尝试 rm 的环境不正确。
有什么好的解决方法?
良好修复的标准:
- 调用者不必传递环境
- 被调用者 (rel.mem) 应该能够通过使用 R 语言工具(调用堆栈检查、方面等)来确定环境
- 函数 rel.mem 的接口应该保持简单——白痴证明:调用 rel.mem——然后 rel.mem 从那里获取它——无需传递环境。
注意事项:
- 正如许多评论者所指出的,一个简单的解决方法是通过环境。
- 我所说的一个好的修复 [我应该澄清它] 的意思是被调用函数(在本例中为 rel.mem)能够计算/找出调用者所指的环境,然后删除对象来自正确的环境。
- “2”中的推理类型可以在其他语言中通过检查调用堆栈来完成 - 例如在 Java 中我会抛出一个虚拟异常 - 捕获它然后解析调用堆栈。在其他语言中,我仍然可以使用面向方面的技术。问题是这样的事情可以在 R 中完成吗?
- 正如一位评论者所建议的那样,可能存在多个具有相同名称的对象,因此“正确”的环境是没有意义的——正如我在上面所说的那样,在其他语言中,有可能(有时使用一些创造性的技巧)解释调用堆栈——这在 R 中可能是不可能的
- 正如一位评论者所建议的那样 rm(list=nm, envir = parent.frame()) 将从父环境中删除它。这是正确的 - 但是我正在寻找适用于任意调用深度的东西。
【问题讨论】:
-
另外,请不要在您的问题中发布诸如
rm(list = ls())之类的命令,除非它们对理解您的问题至关重要 - 您不希望任何人意外运行它们. -
@Gregor -- 实际上我应该指定 -- 我的问题是 -- 有没有办法在不每次都明确传递环境的情况下做到这一点?
-
@Gregor -- 请查看更新后的问题...谢谢。
-
问题指定不充分。在不同的环境中可以有多个具有相同名称的对象。 “正确的环境”是如何定义的?
-
@ZheyuanLi:如果提问者希望“正确答案”是删除找到当前搜索路径的命名对象的第一个实例(在调用函数时),那么我认为使用
apropos()来确定移除的“目标”可能会成功。
标签: r