R语言中的赋值操作

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语言核心,并且不确定如何处理此类赋值。

提前致谢。


2
这是一个很好的问题。您可能会在这里的一些答案中找到一些见解:https://dev59.com/Xmkv5IYBdhLWcg3wpCbJ - Ari B. Friedman
3个回答

16

在我看来,只有对命名的数据结构(比如 'x')才能赋值。

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

描述:

 Assign a value to a name.

x[1] <- 10x <- c(5, 6, 7)不使用相同的函数。前者调用[<-,而后者调用<-


1
啊,好的。但是解析器似乎不能区分以下两种情况:x <- 2x[1] <- 2因为“canonical”函数给出了相同的结果:`<-`(x, 2)`<-`(`[`(x, 1), 2)所以我认为解释器在左值上进行了某种调度。 - Sven Hager

16
根据@Owen对于这个问题的回答,x[1] <- 10实际上是在执行两个操作。它调用了[<-函数,并将该调用的结果赋值给x。
因此,如果您想要实现c(4, 5, 6)[1] <- 10的结果,则需要执行以下操作:
> `[<-`(c(4, 5, 6),1, 10)
[1] 10  5  6

"<-" 函数实际上是一个中缀函数,可以接受2个或更多参数,其中第一个参数 始终 是真正的 R 名称(而不是字符向量)。" - IRTFM

14

您可以修改匿名函数,但是无法对匿名向量进行赋值。即使R使用具有名称的临时副本,有时您也会看到反映这一事实的错误消息。您可以在R语言定义的第21页中阅读到关于“子集赋值”和其他形式赋值表达式的评估的相关信息。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接