首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重命名R列表的组件

重命名R列表的组件
EN

Stack Overflow用户
提问于 2017-08-11 09:27:02
回答 1查看 5.5K关注 0票数 2
代码语言:javascript
复制
l1 <- list(a = 'FirstComponent', b= 'SecondComponent')

要将第一个组件从a重命名为c,我可以这样做:

代码语言:javascript
复制
names(l1) <- c('c', 'b')

或者这个:

代码语言:javascript
复制
names(l1)[1] <- c('c')

但不是这个:

代码语言:javascript
复制
names(l1[1]) <- c('c')

也不是这样:

代码语言:javascript
复制
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")中的返回值作为参数传递给下一个函数,即"[<-"

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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"))中发生的事情是:

  1. z = list('a' = 1, 'b' = 2, 'c' = 3)开始。首先,获取z的名称:nz <- name(Z)# c("a“、"b”、"c")
  2. nz的第三个条目替换为"c2“并返回结果 nznew <- [<-(nz,3,"c2") # c("a","b","c2")
  3. z的名称替换为nznew并返回结果 Z <- names<-(z,nznew)

为什么names(l1[1]) <- 'c'不能工作?它实际上是这样做的,但它没有替换列表的第一个元素。当您调用l1[1]时,它的值将返回到一个新变量(这是一个仅由l1的第一个组件组成的列表),然后修改该变量的名称(但不分配给任何东西!)。例如,尝试

代码语言:javascript
复制
x <- l1[1]
names(x) <- 'c'

看看x的名字是如何变化的。或者,一步一步,x <- `names<-`(l1[1], 'c')

为什么names(l1[[1]]) <- 'c'不能工作?同样的原因,加上l1[[1]]实际上返回了l1的第一个元素的内容,这个元素甚至可能没有names属性。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45631545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档