Использование mapply() или любого из членов его семейства для вызова функции над векторами

У меня есть функция с несколькими векторными и не векторными аргументами:

   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(), но не могу заставить ее работать, так как она либо вкладывает все векторы, либо просто ничего не вкладывает.


person D1X    schedule 12.08.2017    source источник
comment
Функции применения фокусируются на возвращаемом объекте, а не просто на методе итерации, таком как циклы for. Пожалуйста, опишите подробнее, что делает функция (например, желаемый результат).   -  person Parfait    schedule 12.08.2017
comment
@ D1X, пожалуйста, примите любой из ответов ниже, если они были вам полезны, нажав на галочку слева. Это позволит сообществу узнать, что этот ответ сработал для вас.   -  person CPak    schedule 09.09.2017


Ответы (2)


Используйте аргумент MoreArgs, чтобы указать те аргументы, которые вы не хотите векторизовать.

mapply(myfun, NumberS, listofvectors1, MoreArgs=list(vector2, number2))
person Hong Ooi    schedule 12.08.2017

Воспроизводимый пример

Тестовая 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
person CPak    schedule 12.08.2017