如何读取名称文档中的 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"))
z
: 原始向量
y = names(z)
:字符向量 - z 的名称。
y[3]<-"c2"
:提取y
的第三个元素,赋值“c2”。现在我们在 "[<-"(names(z), 3, "c2")
.
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
参考这个例子:
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"))
z
: 原始向量y = names(z)
:字符向量 - z 的名称。y[3]<-"c2"
:提取y
的第三个元素,赋值“c2”。现在我们在"[<-"(names(z), 3, "c2")
.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