15

我想知道赋值如何在 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 语言核心,但我不确定如何处理这样的任务。

提前致谢

4

3 回答 3

16

在我看来,只能将值分配给命名数据结构(如“x”)。

这正是文档?"<-"所说的:

描述:

 Assign a value to a name.

x[1] <- 10不使用与x <- c(5, 6, 7). 前者调用[<-,后者调用<-

于 2012-05-23T12:33:41.597 回答
16

As per @Owen's answer to this question, x[1] <- 10 is really doing two things. It is calling the [<- function, and it is assigning the result of that call to x.

So what you want to achieve your c(4, 5, 6)[1] <- 10 result is:

> `[<-`(c(4, 5, 6),1, 10)
[1] 10  5  6
于 2012-05-23T13:22:28.127 回答
14

您可以对匿名函数进行修改,但不会对匿名向量进行赋值。甚至 R 也会创建带有名称的临时副本,您有时会看到反映该事实的错误消息。您可以在第 21 页的R 语言定义中阅读此内容,其中处理“子集赋值”和其他形式的赋值表达式的评估:

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*用作对象名称,因为它会在下次调用时被覆盖[<-

于 2012-05-23T12:30:42.657 回答