簡體   English   中英

使用list中的對象作為lapply中的函數參數

[英]Using objects inside list as function arguments in lapply

我試圖學習不同的方法來使用列表中的對象作為lapplyFUN參數。 拿這個數據:

A <- list(a = matrix(0, ncol = 3, nrow = 3), b = matrix(0, ncol = 3, nrow = 3))
B <- list(a = matrix(1, ncol = 1, nrow = 3), b = matrix(1, ncol = 1, nrow = 3))
D <- mapply(FUN="list", A, B, SIMPLIFY=F, USE.NAMES=F)
D <- lapply(D, `names<-`, c("first", "second"))
D
[[1]]
[[1]]$`first`
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

[[1]]$second
     [,1]
[1,]    1
[2,]    1
[3,]    1


[[2]]
[[2]]$`first`
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

[[2]]$second
     [,1]
[1,]    1
[2,]    1
[3,]    1

期望的結果:

[[1]]
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
[4,]    1    1    1

[[2]]
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
[4,]    1    1    1

這就是我通常會這樣做的方式:

lapply(D, function(x) rbind(x$first, as.numeric(x$second)))

現在我想知道是否有辦法避免使用function(x)並重復所有那些x s。 就像是:

lapply(D, "rbind", <args>)

我如何讓rbind (或任何其他函數)知道我指的是lapply框架內的對象?

謝謝,

K.

更新

根據提交更改代碼以保持正確的解決方案。


正如一些評論員所說,問題在於B需要轉換,才能找到一個優雅的解決方案。 你應該看看library(purrr)因為整個問題減少到:

map2(A, B, ~ rbind(.x, t(.y)))
# $`a`
#      [,1] [,2] [,3]
# [1,]    0    0    0
# [2,]    0    0    0
# [3,]    0    0    0
# [4,]    1    1    1

# $b
#      [,1] [,2] [,3]
# [1,]    0    0    0
# [2,]    0    0    0
# [3,]    0    0    0
# [4,]    1    1    1

map2作用是它需要2個列表並將該函數應用於這些列表的每個元素。 ~語法是function(.)的快捷方式function(.)

要“避免使用function(x)並重復所有那些x s”,我們可以使用with()

lapply(D, with, rbind(first, as.numeric(second)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM