奇怪的应用R(或变量范围)中的函数

时间:2014-03-01 00:19:32

标签: r

让这个例子解释一下(只是一个玩具示例来演示我在一段复杂的代码中遇到的问题)。在以下示例中,为什么在a之后不会更改data.frame sapply

> 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仅存在于函数内部。我的问题是如何使这个全球化?

1 个答案:

答案 0 :(得分:3)

这是一个更简单的例子:

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