重命名R列表的组件

Rya*_*yan 2 functional-programming r function return-value

l1 <- list(a = 'FirstComponent', b= 'SecondComponent')
Run Code Online (Sandbox Code Playgroud)

要将第一个组件重命名acI ,我可以这样做:

names(l1) <- c('c', 'b')
Run Code Online (Sandbox Code Playgroud)

或这个:

names(l1)[1] <- c('c')
Run Code Online (Sandbox Code Playgroud)

但不是这个:

names(l1[1]) <- c('c')
Run Code Online (Sandbox Code Playgroud)

这不是:

names(l1[[1]]) <- c('c')
Run Code Online (Sandbox Code Playgroud)

为什么第三和第四个代码示例不起作用?他们还尝试重命名一个R对象l1[1]l1[[1]].现场背后发生了什么?

=========以下是原始问题的一部分===========

R文档:可以通过一般规则更新名称属性的一部分:参见示例.这是有效的,因为那里的表达式被评估为z <- "names<-"(z, "[<-"(names(z), 3, "c2")).

names(z)in 的返回值"[<-"(names(z), 3, "c2")作为参数传递给下一个函数,即"[<-".

kon*_*vas 5

您正在寻找在三个不同的功能:<-,[<-names<-.一旦你理解了每一个的作用,将会发生什么.

赋值运算符<-接受两个参数,即变量名和值,并将值赋给该变量.所以`<-`(x, 'y')有同样的效果x <- 'y'.

[<-可以采用多个参数,但您感兴趣的是变量,索引和值.它将指定的值分配给存储在变量中的向量的索引,并返回结果.因此,例如if 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 <- names(z)  # c("a", "b", "c") 
    
    Run Code Online (Sandbox Code Playgroud)
  2. nz用"c2" 替换第3个条目并返回结果

    nznew <- `[<-`(nz, 3, "c2")  # c("a", "b", "c2")
    
    Run Code Online (Sandbox Code Playgroud)
  3. 替换zwith 的名称nznew并返回结果

    z <- `names<-`(z, nznew)
    
    Run Code Online (Sandbox Code Playgroud)

为什么不起作用names(l1[1]) <- 'c'?它实际上确实如此,但它不会替换列表的第一个元素.当您调用时l1[1],其值将返回到一个新变量(这是一个仅包含第一个组件的列表l1),然后修改该变量的名称(但不分配给任何内容!).试试这个例子

x <- l1[1]
names(x) <- 'c'
Run Code Online (Sandbox Code Playgroud)

并看看名称是如何x变化的.或者,一步到位x <- `names<-`(l1[1], 'c').

为什么不起作用names(l1[[1]]) <- 'c'?好吧,与上面相同的原因,加上l1[[1]]实际上返回的第一个元素的内容l1甚至可能没有names属性.