我想知道赋值在R语言中是如何工作的。
考虑以下R shell会话:
> x <- c(5, 6, 7)
> x[1] <- 10
> x
[1] 10 6 7
>我完全理解。创建向量(5,6,7)并将其绑定到符号'x‘。随后,'x‘被重新绑定到新的向量(10,6,7),因为向量是不可变的数据结构。
但是这里发生的事情是:
> c(4, 5, 6)[1] <- 10
Error in c(4, 5, 6)[1] <- 10 :
target of assignment expands to non-language object
>或者在这里:
> f <- function() c(4, 5, 6)
> f()[1] <- 10
Error in f()[1] <- 10 : invalid (NULL) left side of assignment
>在我看来,一个人只能给命名的数据结构赋值(比如'x')。
我之所以问这个问题,是因为我试图实现R语言核心,但我不确定如何处理这样的任务。
提前感谢
发布于 2012-05-23 20:33:42
在我看来,一个人只能给命名的数据结构赋值(比如'x')。
这正是?"<-"的文档所说的:
描述:
为名称赋值。
x[1] <- 10不使用与x <- c(5, 6, 7)相同的功能。前者调用[<-,后者调用<-。
发布于 2012-05-23 21:22:28
根据@Owen对this question的回答,x[1] <- 10实际上正在做两件事。它调用[<-函数,并将该调用的结果赋给x。
因此,您想要实现的c(4, 5, 6)[1] <- 10结果是:
> `[<-`(c(4, 5, 6),1, 10)
[1] 10 5 6发布于 2012-05-23 20:30:43
您可以对匿名函数进行修改,但不会对匿名向量进行赋值。甚至R也会创建带有名称的临时副本,您有时会看到反映这一事实的错误消息。你可以在第21页的R language definition中读到这一点,在那里它处理了“子集赋值”和其他赋值形式的表达式的求值:
x[3:5] <- 13:15
# The result of this commands is as if the following had been executed
`*tmp*` <- x
x <- "[<-"(`*tmp*`, 3:5, value=13:15)
rm(`*tmp*`) 并且有一个警告,不要使用*tmp*作为对象名,因为在下一次调用[<-时,它会被覆盖
https://stackoverflow.com/questions/10719836
复制相似问题