【问题标题】:Recommended way for variable scoping [duplicate]变量范围的推荐方法[重复]
【发布时间】:2017-06-06 11:45:40
【问题描述】:

在 C 和变体中,当你有这样的东西时:

{
  tmp1 <- 5
  tmp2 <- 2
  print(tmp1 + tmp2)
}

将打印 7,但一旦范围 } 结束,tmp1tmp2 变量将从堆栈中删除。我有时希望在 R 中具有类似的功能,这样我就不必在某个时间点之后清理(许多)临时变量。

在 R 中进行这项工作的一种方法如下:

(function(){
  tmp1 <- 5
  tmp2 <- 2
  print(tmp1 + tmp2)
})()

现在这似乎有点骇人听闻——或者可能只是我。

在 R 中是否有更好或更简洁(即更具可读性)的方法来做到这一点?

【问题讨论】:

  • 除了local(),您还可以使用with() 和一个虚拟变量-with(1, { tmp1 &lt;- 5; tmp2 &lt;- 2; print(tmp1 + tmp2) })。它还创建了一个本地环境。
  • @nicola,我一直在寻找一种在 R 中进行变量范围界定的方法,但从未找到这个问题的旧副本,它确实 99% 相同。所以我会留下这个作为搜索的替代品。

标签: r scope


【解决方案1】:

为此,您可能希望在基础 R 中使用 local

local({
  tmp1 <- 5
  tmp2 <- 2
  print(tmp1 + tmp2)
})

因此,在local 范围内创建的任何变量都会在离开范围后立即消失。

来自?local

local 在本地环境中计算表达式。

详情请见?local


此外,with(由 cmets 中的 @Rich Scriven 建议)也可以在基础 R 中使用,其中 1 只是一个虚拟数据:

with(1, {
    tmp1 <- 5
    tmp2 <- 2
    print(tmp1 + tmp2)
})

来自?with

with 是一个通用函数,它在由数据构建的本地环境中计算 expr。

【讨论】:

  • 有趣!谢谢! -- 我会稍等片刻接受答案,尽管这似乎是一种非常干净的 R 方式来模拟变量范围。
【解决方案2】:

在主代码体中,变量是全局的。但是,正如您自己发现的那样,它们的作用域是函数中的局部范围:

addme <- function(){
    tmp1 <- 5;
    tmp2 <- 2;
    return (tmp1+tmp2)
}

然后调用addme() 将返回总和,但变量在外部仍然无法访问

> addme()
[1] 7
> tmp1
Error: object 'tmp1' not found

【讨论】:

  • 这仍然会给我留下一个我必须删除的函数定义......
  • 真的。无论如何,我学到了一些关于with() 函数的知识;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2012-08-21
  • 2015-08-21
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多