是否有一种方法可以在我的lapply()函数中获得列表索引名?
n = names(mylist)
lapply(mylist, function(list.elem) { cat("What is the name of this list element?\n" })
我以前问过是否可以在lapply()返回的列表中保留索引名,但我仍然不知道是否有一种简单的方法来获取自定义函数中的每个元素名。我希望避免对名称本身调用lapply,我宁愿在函数参数中获得名称。
是否有一种方法可以在我的lapply()函数中获得列表索引名?
n = names(mylist)
lapply(mylist, function(list.elem) { cat("What is the name of this list element?\n" })
我以前问过是否可以在lapply()返回的列表中保留索引名,但我仍然不知道是否有一种简单的方法来获取自定义函数中的每个元素名。我希望避免对名称本身调用lapply,我宁愿在函数参数中获得名称。
当前回答
同样的问题我已经遇到过很多次了…… 我开始用另一种方法…我不再使用lapply,而是开始使用mapply
n = names(mylist)
mapply(function(list.elem, names) { }, list.elem = mylist, names = n)
其他回答
同样的问题我已经遇到过很多次了…… 我开始用另一种方法…我不再使用lapply,而是开始使用mapply
n = names(mylist)
mapply(function(list.elem, names) { }, list.elem = mylist, names = n)
不幸的是,lapply只给出你传递给它的向量的元素。 通常的解决方法是向它传递向量的名称或索引,而不是向量本身。
但请注意,你总是可以传递额外的参数给函数,所以下面的工作:
x <- list(a=11,b=12,c=13) # Changed to list to address concerns in commments
lapply(seq_along(x), function(y, n, i) { paste(n[[i]], y[[i]]) }, y=x, n=names(x))
这里我在x的下标上使用lapply,但也传递了x和x的名称。正如你所看到的,函数参数的顺序可以是任何东西——lapply将“元素”(这里是索引)传递给额外的参数中未指定的第一个参数。在这种情况下,我指定了y和n,所以只剩下I了……
这会产生以下结果:
[[1]]
[1] "a 11"
[[2]]
[1] "b 12"
[[3]]
[1] "c 13"
更简单的例子,相同的结果:
lapply(seq_along(x), function(i) paste(names(x)[[i]], x[[i]]))
这里,函数使用“全局”变量x并在每次调用中提取名称。
只需要把名字循环进去。
sapply(names(mylist), function(n) {
doSomething(mylist[[n]])
cat(n, '\n')
}
只需编写自己的自定义lapply函数
lapply2 <- function(X, FUN){
if( length(formals(FUN)) == 1 ){
# No index passed - use normal lapply
R = lapply(X, FUN)
}else{
# Index passed
R = lapply(seq_along(X), FUN=function(i){
FUN(X[[i]], i)
})
}
# Set names
names(R) = names(X)
return(R)
}
然后像这样使用:
lapply2(letters, function(x, i) paste(x, i))
您可以尝试从purrr包中使用imap()。
从文档中可以看到:
Imap (x,…)是map2(x, names(x),…)的简写,如果x有名称,则Imap (x, seq_along(x),…)
所以,你可以这样使用它:
library(purrr)
myList <- list(a=11,b=12,c=13)
imap(myList, function(x, y) paste(x, y))
这将给你以下结果:
$a
[1] "11 a"
$b
[1] "12 b"
$c
[1] "13 c"