3

有没有办法可以让 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”等。列表中每个元素的一个元素?

谢谢!

4

3 回答 3

14

该函数的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))
于 2012-09-10T03:54:48.237 回答
7

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')
于 2012-09-10T03:26:11.120 回答
2

您是否要求对正在发生的特定价值观和过程进行“评论”?

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
于 2012-09-10T03:48:34.990 回答