l1 <- list(a = 'FirstComponent', b= 'SecondComponent')要将第一个组件从a重命名为c,我可以这样做:
names(l1) <- c('c', 'b')或者这个:
names(l1)[1] <- c('c')但不是这个:
names(l1[1]) <- c('c')也不是这样:
names(l1[[1]]) <- c('c')为什么第三和第四代码示例不能工作?他们还试图重命名一个R对象l1[1]和l1[[1]]。幕后发生了什么事?
=========Following是原始question===========的一部分。
R文档:可以通过一般规则更新名称属性的一部分:参见示例。这是因为其中的表达式被计算为
z <- "names<-"(z, "[<-"(names(z), 3, "c2"))。
names(z)在"[<-"(names(z), 3, "c2")中的返回值作为参数传递给下一个函数,即"[<-"。
发布于 2017-08-11 10:33:13
您将看到三个不同的函数:<-、[<-和names<-。一旦你了解了其中每一种行为,正在发生的事情就会很清楚。
赋值运算符<-接受两个参数,一个变量名和一个值,并将值分配给该变量。因此,`<-`(x, 'y')具有与x <- 'y'相同的效果。
[<-可以接受许多参数,但是您感兴趣的是变量、索引和值。它将指定的值赋值给存储在变量中的向量的索引,并返回结果。例如,如果是a <- c(1, 2, 3),那么`[<-`(a, 2, 10)将返回向量a的(副本),并将其第二个条目替换为10。
names<-是一个函数,它接受两个参数,一个列表和一个名称向量,并将这些名称赋给列表。因此,`names<-`(l1, c('a', 'b'))只是编写names(l1) <- c('a', 'b')的另一种方式。
文档告诉您的是,如何根据names<-的定义定义函数[<-。在z <- `names<-`(z, `[<-`(names(z), 3, "c2"))中发生的事情是:
z = list('a' = 1, 'b' = 2, 'c' = 3)开始。首先,获取z的名称:nz <- name(Z)# c("a“、"b”、"c")nz的第三个条目替换为"c2“并返回结果
nznew <- [<-(nz,3,"c2") # c("a","b","c2")z的名称替换为nznew并返回结果
Z <- names<-(z,nznew)为什么names(l1[1]) <- 'c'不能工作?它实际上是这样做的,但它没有替换列表的第一个元素。当您调用l1[1]时,它的值将返回到一个新变量(这是一个仅由l1的第一个组件组成的列表),然后修改该变量的名称(但不分配给任何东西!)。例如,尝试
x <- l1[1]
names(x) <- 'c'看看x的名字是如何变化的。或者,一步一步,x <- `names<-`(l1[1], 'c')。
为什么names(l1[[1]]) <- 'c'不能工作?同样的原因,加上l1[[1]]实际上返回了l1的第一个元素的内容,这个元素甚至可能没有names属性。
https://stackoverflow.com/questions/45631545
复制相似问题