【问题标题】:weird apply functions in R (or variable scope)R(或变量范围)中的奇怪应用函数
【发布时间】:2014-03-01 00:19:32
【问题描述】:

让例子解释一下(只是一个玩具例子来演示我在一段复杂代码中遇到的问题)。在下面的例子中,为什么sapply之后data.framea没有变化?

> a=data.frame(A=c(1,2,3),B=c(4,5,6))
> a
  A B
1 1 4
2 2 5
3 3 6
> a[c(T,T,F),]
  A B
1 1 4
2 2 5
> sapply(c(1,2), function(x) a=a[c(T,T,F),])
  [,1]      [,2]
A Numeric,2 Numeric,2
B Numeric,2 Numeric,2
> a
  A B
1 1 4
2 2 5
3 3 6

再想一想,这可能是因为命名空间。更改后的a 仅存在于函数内部。那么我的问题是如何使其全球化?

【问题讨论】:

  • 一般来说,R 不会就地修改对象。毕竟,它本质上是功能性的。但除此之外,我不确定您要通过 sapply 调用来完成什么。您的预期输出到底是什么?也许您只是想将sapply 的结果分配给a
  • 只是一个简单的例子来解释我的问题。
  • 好吧,在 R 中,您通常不会就地修改对象。您可以使用<<-,但这被认为是非常糟糕的做法。相反,你会这样a <- sapply(...)
  • 我的意思是,就像拉斯维加斯一样,“函数内部发生的事情停留在函数内部”,这是 R 的基本设计原则。违反它被认为是不好的实践。但如果你真的必须(而你不应该)你可以使用<<-assign
  • ...如果您只是在寻找有关 R 范围的参考,您可以简单地浏览 manual

标签: r


【解决方案1】:

这是一个更简单的例子:

f <- function() a <- 1
a <- 2
f()
a # a is still 2

正在发生的事情是:

  1. 函数f和变量a是在全局环境中创建的。
  2. f 不带参数运行。
  3. 在正在运行的f 内部创建了一个新变量a,其值为1。
    它在函数中创建的a与全局环境中的a无关。
  4. f 完成运行并返回结果 1 并销毁创建的 a 在函数中。
  5. 我们要求显示a,它一直没有改变,所以显示为2。

如果我们在函数中分配一个变量名,R 会在函数中创建一个具有该名称的新对象。它不会在函数外部更改同名变量,而是现在存在两个同名变量,直到函数完成运行,然后在函数中创建的变量被销毁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多