代码之家  ›  专栏  ›  技术社区  ›  D1X

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

  •  0
  • D1X  · 技术社区  · 8 年前

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

    我要执行以下操作:

    1. 对向量调用此函数 number numberS .
    2. vector1 从列表中获取 listofvectors1 .
    3. vector2 number2 每次通话都是一样的。

    为了更清楚地说明这一点,我将对循环执行以下操作:

    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() 但我不能让它工作,因为它要么嵌套所有向量,要么干脆什么都不嵌套。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Hong Ooi    8 年前

    使用 MoreArgs 想要矢量化。

    mapply(myfun, NumberS, listofvectors1, MoreArgs=list(vector2, number2))
    
        2
  •  1
  •   CPak    8 年前

    可复制示例

    测试 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
    
    推荐文章