【发布时间】: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