有没有办法可以让 lapply 声明也显示索引?更具体地说,考虑以下示例:
mylist <- list(c(5,4),c(3,2), c(1,3))
myfunction<- function(values){
print("Adding values: ")
return(values[1] + values[2])
}
lapply(mylist, myfunction)
有没有办法让它打印“添加值:1”“添加值:2”等。列表中每个元素的一个元素?
谢谢!
该函数的mapply
工作方式类似lapply
,但允许您提供多个向量或列表。
在您的情况下,您可以创建第二个向量,与列表的长度相同,只是向上计数:
mapply(myfunction, mylist, seq_along(mylist))
让我们尝试一下:
myfunction<- function(values, index){
cat("Adding values (", index, "): ", values[1], "...", values[2], " = ", sum(values), "\n" )
invisible(values[1] + values[2])
}
mylist <- list(c(5, 4), c(3, 2), c(1, 3))
mapply(myfunction, mylist, seq_along(mylist))
结果:
Adding values ( 1 ): 5 ... 4 = 9
Adding values ( 2 ): 3 ... 2 = 5
Adding values ( 3 ): 1 ... 3 = 4
只是为了好玩,仔细阅读?lapply
手册页会发现以下内容也有效:
myfunction<- function(values){
print(sprintf("Adding values: %i",substitute(values)[[3]]))
return(values[1] + values[2])
}
lapply(mylist, myfunction)
这表明可以创建一个通用函数适配器来为您的原始函数(或任何其他函数)提供索引,修改为期望第二个索引参数:
myfunction<- function(values,index){
print(sprintf("Adding values: %i",index))
return(values[1] + values[2])
}
现在适配器
lapply_index_adaptor=function(f)function(x,...)f(x,substitute(x)[[3]],...)
现在使用适配器进行 lapply 调用:
lapply(mylist, lapply_index_adaptor(myfunction))
message
如果您的意思是消息,则很好用。
mylist <- list(c(5, 4), c(3, 2), c(1, 3))
如果你想要索引(重读这可能是你想要的)
myfunction_idx <- function(idx, x) {
.x <- x[[idx]]
message(sprintf("Adding values %s:", idx))
sum(.x)
}
lapply(seq_along(mylist), myfunction_idx, x = mylist)
## Adding values 1:
## Adding values 2:
## Adding values 3:
## [[1]]
## [1] 9
##
## [[2]]
## [1] 5
##
## [[3]]
## [1] 4
##
该plyr
包将即时构建一个进度条(lapply
会更快
library(plyr)
llply(mylist, sum, .progress = 'text')
您是否要求对正在发生的特定价值观和过程进行“评论”?
myfunction<- function(values){
cat("Adding values: ", values[1], "...", values[2], " = ", sum(values), "\n" )
invisible(values[1] + values[2])
}
lapply(mylist, myfunction)
Adding values: 5 ... 4 = 9
Adding values: 3 ... 2 = 5
Adding values: 1 ... 3 = 4
[[1]]
[1] 9
[[2]]
[1] 5
[[3]]
[1] 4