r - 为什么 name(x)<-y 和 "names<-"(x,y) 不等价?

标签 r names

考虑以下因素:

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 是很常见的(例如 namesnames<- )。在这种情况下,<-后缀函数是对应不带后缀版本的替换函数。
  • 如开头所述,此行为是通用行为,并且是语言的属性,因此不需要在任何替换函数文档中对其进行讨论。

关于r - 为什么 name(x)<-y 和 "names<-"(x,y) 不等价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65395373/

相关文章:

r - 将数据框转换为深度嵌套列表

r - 使用列名作为 data.table 中公式的输入

excel - Wbk 中已删除的名称仍然存在并引用不存在的位置,导致 Excel 速度变慢

截距为零的随机效应方差

r - 使用 reshape 创建纵向数据集

r - cbind i :th name of a list-of-lists to the i:th list

angularjs - 用于初始化名字的 Angular 过滤器

regex - 提取带有前缀的姓氏的正则表达式

非时间数据的 R 运行平均值

r - 选择多列中符合条件的行