【问题标题】:Assignment in R languageR语言赋值
【发布时间】:2012-05-29 23:52:51
【问题描述】:

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

提前致谢

【问题讨论】:

标签: r variable-assignment


【解决方案1】:

您可以对匿名函数进行修改,但不能对匿名向量进行赋值。甚至 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* 作为对象名称,因为它会在下次调用 [&lt;- 时被覆盖

【讨论】:

    【解决方案2】:

    在我看来,只能为命名数据结构(如“x”)赋值。

    这正是?"&lt;-" 的文档所说的:

    说明:

     Assign a value to a name.
    

    x[1] &lt;- 10 不使用与x &lt;- c(5, 6, 7) 相同的功能。前者调用[&lt;-,而后者调用&lt;-

    【讨论】:

    • 嗯,好的。但是解析器似乎在 x canonical 函数给了我&lt;-(x, 2) 和&lt;-([(x, 1) , 2) 所以我认为解释器以某种方式在左值上调度。
    【解决方案3】:

    根据@Owen 对this question 的回答,x[1] &lt;- 10 确实在做两件事。它正在调用[&lt;- 函数,并将该调用的结果分配给x。

    所以你想要达到你的c(4, 5, 6)[1] &lt;- 10结果是:

    > `[<-`(c(4, 5, 6),1, 10)
    [1] 10  5  6
    

    【讨论】:

    • &lt;- 函数实际上是一个中缀函数,它可以接受 2 个以上的参数,第一个参数总是是一个真正的 R 名称(不是字符向量)。
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多