首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R语言中的赋值

R语言中的赋值
EN

Stack Overflow用户
提问于 2012-05-23 20:22:45
回答 3查看 6.9K关注 0票数 15

我想知道赋值在R语言中是如何工作的。

考虑以下R shell会话:

代码语言:javascript
复制
> x <- c(5, 6, 7)
> x[1] <- 10
> x
[1] 10 6 7
>

我完全理解。创建向量(5,6,7)并将其绑定到符号'x‘。随后,'x‘被重新绑定到新的向量(10,6,7),因为向量是不可变的数据结构。

但是这里发生的事情是:

代码语言:javascript
复制
> c(4, 5, 6)[1] <- 10
Error in c(4, 5, 6)[1] <- 10 :
  target of assignment expands to non-language object
>

或者在这里:

代码语言:javascript
复制
> f <- function() c(4, 5, 6)
> f()[1] <- 10
Error in f()[1] <- 10 : invalid (NULL) left side of assignment
>

在我看来,一个人只能给命名的数据结构赋值(比如'x')。

我之所以问这个问题,是因为我试图实现R语言核心,但我不确定如何处理这样的任务。

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-23 20:33:42

在我看来,一个人只能给命名的数据结构赋值(比如'x')。

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

描述:

为名称赋值。

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

票数 16
EN

Stack Overflow用户

发布于 2012-05-23 21:22:28

根据@Owen对this question的回答,x[1] <- 10实际上正在做两件事。它调用[<-函数,并将该调用的结果赋给x。

因此,您想要实现的c(4, 5, 6)[1] <- 10结果是:

代码语言:javascript
复制
> `[<-`(c(4, 5, 6),1, 10)
[1] 10  5  6
票数 16
EN

Stack Overflow用户

发布于 2012-05-23 20:30:43

您可以对匿名函数进行修改,但不会对匿名向量进行赋值。甚至R也会创建带有名称的临时副本,您有时会看到反映这一事实的错误消息。你可以在第21页的R language definition中读到这一点,在那里它处理了“子集赋值”和其他赋值形式的表达式的求值:

代码语言:javascript
复制
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*作为对象名,因为在下一次调用[<-时,它会被覆盖

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10719836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档