Rya*_*yan 2 functional-programming r function return-value
l1 <- list(a = 'FirstComponent', b= 'SecondComponent')
Run Code Online (Sandbox Code Playgroud)
要将第一个组件重命名a为cI ,我可以这样做:
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")作为参数传递给下一个函数,即"[<-".
您正在寻找在三个不同的功能:<-,[<-和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")):
从例如开始z = list('a' = 1, 'b' = 2, 'c' = 3).首先,获取z的名称:
nz <- names(z) # c("a", "b", "c")
Run Code Online (Sandbox Code Playgroud)nz用"c2" 替换第3个条目并返回结果
nznew <- `[<-`(nz, 3, "c2") # c("a", "b", "c2")
Run Code Online (Sandbox Code Playgroud)替换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属性.