如何读取名称文档中的 z <- "names<-"(z, "[<-"(names(z), 3, "c2")) 行?

How is the z <- "names<-"(z, "[<-"(names(z), 3, "c2")) line in the names documentation read?

参考这个例子:

z <- list(a = 1, b = "c", c = 1:3)  
names(z)  
# change just the name of the third element.  
names(z)[3] <- "c2"  
z  

names documentation 说“查看示例。之所以有效,是因为那里的表达式被评估为 z <- "names<-"(z, "[<-"(names( z), 3, "c2"))."

这最后一行代码是关于什么的?它不符合我熟悉的 R 语法,所以我什至无法理解如何阅读它。如果有的话,它似乎比它试图解释的例子更复杂。我该如何阅读?

文档那部分确实写的不好,不怪你糊涂了

这里是简短的回答,假设你有一个向量 z = c(a = 1, b = 2, c = 3),那么下面是等价的:

names(z)[3] <- "c2"

z <- "names<-"(z, "[<-"(names(z), 3, "c2"))

文档就是这么说的。

这是更长的答案:在 R 中,您可能熟悉函数的基本语法,所以假设您有 foo = function(x,y) x + y,那么您可能习惯于调用 foo(1, 2)。您可能还见过 'infix' 运算符,例如 +,因此您可能熟悉 1 + 2。然而在内部这实际上被读作 "+"(1,2) (试试这个它会起作用)。赋值和提取函数也有类似的情况,例如 x[1](对于某些向量 x)或本例中的 names(z)[3] <- ,其中 <- 是赋值运算符。

为了使这个示例更加复杂,实际上使用了两个独立的中缀运算符!有 names<-[<-,第一个用于设置向量的名称,第二个用于在第一次提取向量后设置向量中的值(我知道有一个这里发生了很多事情)。

所以用更熟悉的 R 代码分解该行的内容:

z <- "names<-"(z, "[<-"(names(z), 3, "c2"))
  1. z: 原始向量
  2. y = names(z):字符向量 - z 的名称。
  3. y[3]<-"c2":提取y的第三个元素,赋值“c2”。现在我们在 "[<-"(names(z), 3, "c2").
  4. names(z)<-y:将z的名字设置为y。现在我们在 "names<-"(z, "[<-"(names(z), 3, "c2")).

让事情变得更加混乱 "names<-" 不保存新命名的矢量,它只是设置新名称。这就是为什么最后需要 z <- "names<-"... 来用新命名的变量覆盖原始变量。

并用 R 代码显示:

> z = c(a = 1, b = 2, c = 3)
> print(z)
a b c 
1 2 3 
> names = names(z)
> names[3] = "c2"
> names(z) = names
> print(z)
 a  b c2 
 1  2  3