使用 mapply() 或其任何家族成员通过向量调用函数

Using mapply() or any of its family members to call a function over vectors

我有一个包含多个矢量和非矢量参数的函数:

   myfun <- function( number , vector1, vector2, number2) {
      # test function thanks to Chi Pak
      temp <- number * vector1 + max(vector2) * number2
      return(temp)
   }

我想执行以下操作:

  1. numbernumberS 的向量调用此函数。
  2. 对于上面的每个数字,我希望用从列表 listofvectors1.
  3. 中获得的每个 vector1 中的一个来调用它
  4. vector2number2 每次调用都相同。

为了更清楚地说明,这就是我要用循环做的事情:

numberS <- c(1,2,3)
listofvectors1 <- list(c(1,2,3), c(5,6,7,8), c(0,1) ) # Obviously has the same length as numberS
vector2 <- c(0.5,3,1)
number2 <- 3.14

for (i in 1:length(numberS)){
   myfun(numberS[i], listofvectors1[[i]], vector2, number2)
}

我想使用像 apply() 这样的函数来做到这一点,我一直在尝试使用 mapply() 但我无法让它工作,因为它要么嵌套所有向量,要么根本不嵌套'不要嵌套任何东西。

可重现的例子

一个测试myfun函数

myfun <- function( number , vector1, vector2, number2) {
      temp <- number * vector1 + max(vector2) * number2
      return(temp)
   }

你的价值观

numberS <- c(1,2,3)
listofvectors1 <- list(c(1,2,3), c(5,6,7,8), c(0,1) ) # Obviously has the same length as numberS
vector2 <- c(0.5,3,1)
number2 <- 3.14

你可以这样使用lapply

lapply(1:length(numberS), function(x) myfun(numberS[x], listofvectors1[[x]], vector2, number2))

# [[1]]
# [1] 10.42 11.42 12.42
# etc

或者像这样purrr::map2

library(purrr)
map2(numberS, listofvectors1, ~myfun(.x, .y, vector2, number2))

# [[1]]
# [1] 10.42 11.42 12.42
# etc

使用 MoreArgs 参数指定您不想 向量化的那些参数。

mapply(myfun, NumberS, listofvectors1, MoreArgs=list(vector2, number2))