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)

「Adding Values: 1」「Adding Values: 2」など、リスト内の各要素を 1 つずつ出力する方法はありますか?

ありがとう!

4

3 に答える 3

14

この関数mapplyは同様に機能しlapplyますが、複数のベクトルまたはリストを指定できます。

あなたの場合、カウントアップするだけで、リストと同じ長さの2番目のベクトルを作成できます。

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)

これは、元の関数 (またはその他の関数) にインデックスを提供するために一般的な関数アダプターを作成し、2 番目のインデックス引数を期待するように変更できることを示唆しています。

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(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 に答える