【问题标题】:Rename a component of R lists重命名 R 列表的组件
【发布时间】:2018-01-19 18:08:07
【问题描述】:
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]]。幕后发生了什么?

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

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

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

【问题讨论】:

  • 对于你的第一个问题,一切都可以成为 R 中的一个函数,例如你可以分配像 this"&lt;-"(iris$new_var,1); head(iris) 这样的变量 - (注意我用引号而不是反引号,因为在 cmets 中显示反引号很棘手)
  • 谢谢!发布问题后,我很快就弄清楚了。我将编辑我的问题,使其专注于第二个问题。
  • 即使获取names函数的源代码也是一项繁琐的任务!!!

标签: r function functional-programming return-value


【解决方案1】:

您正在查看三个不同的函数:&lt;-[&lt;-names&lt;-。一旦您了解了这些中的每一个的作用,正在发生的事情就会很清楚。

赋值运算符&lt;- 接受两个参数,一个变量名和一个值,并将值赋给该变量。所以`&lt;-`(x, 'y')x &lt;- 'y' 的效果是一样的。

[&lt;- 可以接受许多参数,但您感兴趣的是变量、索引和值。它将指定的值分配给存储在变量中的向量的索引并返回结果。例如,如果a &lt;- c(1, 2, 3),那么`[&lt;-`(a, 2, 10) 将返回(一个副本)向量a,将其第二个条目替换为10。

names&lt;- 是一个函数,它接受两个参数,一个列表和一个名称向量,并将这些名称分配给列表。 所以`names&lt;-`(l1, c('a', 'b')) 只是写names(l1) &lt;- c('a', 'b') 的另一种方式。

文档告诉你的是函数names&lt;-是如何定义的,基于[&lt;-的定义。发生了什么 z &lt;- `names&lt;-`(z, `[&lt;-`(names(z), 3, "c2")) 是:

  1. 开始例如与z = list('a' = 1, 'b' = 2, 'c' = 3)。首先,获取z的名字:

    nz <- names(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]) &lt;- 'c' 不起作用?它确实如此,但它不会替换列表的第一个元素。当您调用l1[1] 时,它的值将返回到一个新变量(这是一个仅包含l1 的第一个组件的列表),然后该变量的名称被修改(但没有分配给任何东西!)。举个例子

x <- l1[1]
names(x) <- 'c'

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

为什么names(l1[[1]]) &lt;- 'c' 不起作用?好吧,和上面的原因一样,加上l1[[1]] 实际上返回了l1 的第一个元素的内容,它甚至可能没有names 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 2022-11-17
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多