Применить функцию ко всем комбинациям аргументов (вывести в виде списка)

Это решение почти то, что мне нужно, но не работает в моем случае. Вот что я пробовал:

comb_apply <- function(f,...){
  exp <- expand.grid(...,stringsAsFactors = FALSE)
  apply(exp,1,function(x) do.call(f,x))
}

#--- Testing Code
l1 <- list("val1","val2")
l2 <- list(2,3)

testFunc<-function(x,y){
  list(x,y)
}

#--- Executing Test Code
comb_apply(testFunc,l1,l2)
comb_apply(paste,l1,l2)

Это работает для примера paste, но я получаю сообщение: Error in (function (x, y) : unused arguments (Var1 = "val1", Var2 = 2), когда я пробую свой testFunc.

Я ожидаю получить в результате:

list(list("val1",2),list("val1",3),list("val2",2),list("val2",3))

Мотивация

Я пришел из Mathematica, на котором выполнить эту операцию так же просто, как:

l1 = {"val1", "val2"}
l2 = {2, 3}
testFunc = {#1, #2} &
Outer[testFunc, l1, l2]

Как я могу сделать это в R?


person Murta    schedule 06.06.2015    source источник
comment
R имеет функцию ?outer.   -  person sgibb    schedule 06.06.2015
comment
@sgibb Мне нужен общий случай, когда возможно более двух списков.   -  person Murta    schedule 06.06.2015


Ответы (2)


После нескольких проб и ошибок я нашел решение.

Чтобы заставить comb_apply работать, мне нужно было unname каждое значение опыта перед его использованием. Вот код:

comb_apply <- function(f,...){
  exp <- expand.grid(...,stringsAsFactors = FALSE)
  apply(exp,1,function(x) do.call(f,unname(x)))
}

Теперь, выполняя str(comb_apply(testFunc,l1,l2)), я получаю желаемый результат, без изменения testFunc.

person Murta    schedule 07.06.2015

Я бы использовал mapply или plyr::mlply для этого,

comb_apply <- function(f,..., MoreArgs=list()){
  exp <- unname(expand.grid(...,stringsAsFactors = FALSE))
  do.call(mapply, c(list(FUN=f, SIMPLIFY=FALSE, MoreArgs=MoreArgs), exp))
}
person baptiste    schedule 07.06.2015