簡體   English   中英

向lapply的FUN傳遞了不止一個論點

[英]passing more than one argument to FUN of lapply

我的問題基於另一個類似的問題: 將幾個參數傳遞給lapply(和其他* apply)的FUN

我有一個自定義函數來創建一個data.frame 目標是為每個新的輸入變量檢索data.frames列表(我想對幾個輸入變量進行循環以創建新的data.frames )。

如果只更改一個輸入變量,我設法做到了:

fn <- function(a, b){
        data.frame(res = c(a, b, a + b),
                   text = c("a", "b", "total"))
}
fn(1, 2)
#>   res  text
#> 1   1     a
#> 2   2     b
#> 3   3 total

lapply(1:3, FUN = fn, b = 1)
#> [[1]]
#>   res  text
#> 1   1     a
#> 2   1     b
#> 3   2 total
#> 
#> [[2]]
#>   res  text
#> 1   2     a
#> 2   1     b
#> 3   3 total
#> 
#> [[3]]
#>   res  text
#> 1   3     a
#> 2   1     b
#> 3   4 total

但是,一旦我也更改了第二個輸入變量(b),就會收到一條錯誤消息。

lapply(1:3, FUN = fn, b = 1:3)

data.frame中的錯誤(res = c(a,b,a + b),text = c(“ a”,“ b”,“ total”))):參數暗示行數不同:7,3

上面的問題(請參閱鏈接)中建議的方法是使用mapply 這有效,但是返回一個matrix ,我將其解釋為列表列表(如果我錯了,請更正我)。

x <- mapply(fn, b = 1:3, a = 1:3)
x
#>      [,1]      [,2]      [,3]     
#> res  Integer,3 Integer,3 Integer,3
#> text factor,3  factor,3  factor,3

為了得到想要的data.frames列表,我可以再次使用apply

apply(x, 2, data.frame)
#> [[1]]
#>   res  text
#> 1   1     a
#> 2   1     b
#> 3   2 total
#> 
#> [[2]]
#>   res  text
#> 1   2     a
#> 2   2     b
#> 3   4 total
#> 
#> [[3]]
#>   res  text
#> 1   3     a
#> 2   3     b
#> 3   6 total

reprex軟件包 (v0.2.1)創建於2019-05-22


問題 :有沒有一種方法可以避免mapply然后在自定義函數中apply多個輸入變量?

你可以做:

library(purrr)

map2(1:3, 1:3, fn)

[[1]]
  res  text
1   1     a
2   1     b
3   2 total

[[2]]
  res  text
1   2     a
2   2     b
3   4 total

[[3]]
  res  text
1   3     a
2   3     b
3   6 total

如果您想堅持地圖繪制,可以執行以下操作:

x <- mapply(fn, b = 1:3, a = 1:3, SIMPLIFY = F)

要么

x <- Map(fn, b = 1:3, a = 1:3)

這是SIMPLIFY = F mapply的包裝。

暫無
暫無

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

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