考虑以下因素:
y<-c("A","B","C")
x<-z<-c(1,2,3)
names(x)<-y
"names<-"(z,y)
如果你运行这段代码,你会发现 names(x)<-y
与 "names<-"(z,y)
不同。特别是,人们看到names(x)<-y
实际上更改了 x
的名称而"names<-"(z,y)
返回z
名称已更改。
这是为什么呢?我的印象是,正常编写函数和将其编写为中缀运算符之间的区别只是语法之一,而不是实际改变输出的东西。文档中的哪里讨论了这种差异?
最佳答案
简短回答:names(x)<-y
实际上是x<-"names<-"(x,y)
的糖不仅仅是"names<-"(x,y)
。请参阅the R-lang manual ,第 18-19 页(PDF 第 23-24 页),基本上是相同的示例。
For example,
names(x) <- c("a","b")
is equivalent to:`*tmp*`<-x x <- "names<-"(`*tmp*`, value=c("a","b")) rm(`*tmp*`)
如果对 getter/setter 比较熟悉,可以认为 if somefunction
是一个 getter 函数,somefunction<-
是相应的设置者。在 R 中,每个对象都是不可变的,将 setter 称为替换函数更正确,因为该函数实际上创建一个与旧对象相同的新对象,但添加/修改/删除了一个属性并用这个新对象替换旧对象。
例如,在本例中,names
属性不仅仅添加到 x
;而是一个具有相同值 x
的新对象但与 names
已创建并链接到x
符号。
由于对于为什么在语言文档中讨论这个问题而不是直接在 ?names
上仍然存在一些疑问,这里是 R 语言这一属性的简要回顾。
- 您可以使用您想要的名称定义函数(当然有一些限制),并且如果“正常”调用该函数,该名称不会产生任何影响。
- 但是,如果您使用
<-
命名函数后缀,它成为一个替换函数,并且如果通过语法foo(x)<-value
调用,则允许解析器使用本答案开头描述的机制应用该函数。 。看到这里你没有显式调用foo<-
,但使用稍微不同的语法,您将获得一个对象替换(从名称开始)。 - 尽管没有正式的限制,但在 R 中使用相同名称定义 getter/setter 是很常见的(例如
names
和names<-
)。在这种情况下,<-
后缀函数是对应不带后缀版本的替换函数。 - 如开头所述,此行为是通用行为,并且是语言的属性,因此不需要在任何替换函数文档中对其进行讨论。
关于r - 为什么 name(x)<-y 和 "names<-"(x,y) 不等价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65395373/