2013-12-16 2 views
1

У меня есть функция, которая имеет аргумент arg, который может отсутствовать. Если он отсутствует, ему присваивается определенное значение в пределах foo.Передача аргумента из обертки во внутреннюю функцию, когда аргумент может отсутствовать во внутренней функции - возможно?

foo <- function(x, arg) { 
    if (missing(arg)) 
    arg <- TRUE 
    arg 
} 

Я хочу, чтобы написать оболочку, которая вызывает foo для нескольких элементов списка с помощью sapply или lapply. И я хочу передать аргумент arg следующим образом.

foo_wrapper <- function(x, arg) { 
    sapply(x, foo, arg=arg) 
} 

Это будет сгенерировано сообщение об ошибке, как arg не найден, когда она оценивается в пределах foo_wrapper.

> m <- list(1,2,3) 
> foo(m) 
[1] TRUE 
> foo_wrapper(m) 

Error in FUN(X[[1L]], ...) : argument "arg" is missing, with no default 

Теперь, я мог бы использовать dots аргументы для этой цели, которая будет работать.

foo_wrapper <- function(x, ...) { 
    sapply(x, foo, ...) 
} 

> m <- list(1,2,3) 
> foo(m) 
[1] TRUE 
> foo_wrapper(m) 
[1] TRUE TRUE TRUE 

Тем не менее, я хотел бы знать, если есть способ включить arg аргумент в функции упаковщика в явном виде, а не передавать его через dots аргумент.

Есть ли способ?

+0

Если вы специально не хотите значения по умолчанию, вы можете написать 'foo_wrapper <-function (x, arg = 0)' –

+0

Или, если быть точным, 'arg = TRUE', поскольку это значение по умолчанию во внутренней функции –

+0

Проблема в том, что я хочу, чтобы те же значения по умолчанию, что и внутренняя функция, и их нет :) –

ответ

2

Вы можете проверить ли arg отсутствует перед вызовом sapply:

foo_wrapper <- function(x, arg) 
if(missing(arg)) sapply(x, foo) else sapply(x, foo, arg=arg) 

, но это, вероятно, чище всего использовать ....

+0

Я нахожу, что это хорошая идея! ... К сожалению, это невозможно для меня, так как есть несколько аргументов, которые разрешены. Таким образом, это быстро приведет к быстро растущему числу возможных комбинаций вызовов и в довольно грязном коде. Спасибо за идею! –

Смежные вопросы