2017-01-05 4 views
1

Предположим, у меня есть функция, которая создает x количество объектов на основе длины входной переменной. Затем я хочу, чтобы эти x количество объектов, которые будут использоваться в качестве аргументов в функции, которую я предоставляю своей функции. Предположим, что мое число аргументов является переменной (в зависимости от количества предоставленных аргументов), как я могу это сделать?Добавить строку (переменное число) аргументов функции в функции

Могу ли я сделать это с помощью строки имен аргументов?

нерабочим пример, чтобы проиллюстрировать, что я спрашиваю:

(в данном случае, используя аргументы, созданные за пределами функции для упрощения примера):

foo <- 1:5 
na.rm <- T 
func <- mean 

f1 <- function(func,arg.names) { 
    func(get(arg.names)) } 
f1(func,arg.names = c('foo','na.rm') 

Как мне это сделать таким образом, что все аргументы get из моего списка?

ответ

2

Мы можем попытаться с mget

f1 <- function(func,arg.names) { 
     lst <- mget(arg.names, envir = parent.frame()) 
     func(lst[[1]], na.rm = lst[[2]]) 
} 

f1(func, arg.names = c('foo', 'na.rm')) 
#[1] 3 

Или другой вариант do.call (как указано в пост @ thelatemail), но изменить name первого list элемента «х», как x является аргумент 'данные' в функции mean

## по умолчанию S3 метод:

средних (х, подрезать = 0, na.rm = FALSE, ...)

f1 <- function(func,arg.names) { 
     lst <- mget(arg.names, envir = parent.frame()) 
     names(lst)[1] <- 'x' 
     do.call(func, lst) 
    } 

f1(func, arg.names = c('foo', 'na.rm')) 
#[1] 3 
+0

Отлично! Это именно то, что я ищу! Спасибо @akrun. Но теперь реальный вопрос ... это правильный (лучший) способ добиться того, что я пытаюсь сделать? Или мой подход, возможно, «неаккуратный» или ненадлежащий подход? – theforestecologist

+0

@theforestecologist. Спасибо, Что касается вопроса, это зависит от того, почему вы должны пройти этот маршрут. Возможно, вы можете опубликовать новый вопрос, дающий более подробную информацию о конечной цели. – akrun

1

Магия ?do.call вас ждет:

do.call(func, list(foo, na.rm=na.rm)) 
#[1] 3 

Это в основном просто создает и работает:

func(foo, na.rm=na.rm) 

... где аргументы func передаются как (потенциально) с именем списка ,

+0

что, если я должен поставить аргументы как строки, против самих имен объектов? (например, 'foo' & 'na.rm' vs. foo & na.rm) – theforestecologist

+1

@ theforestecologist - Я думаю, что акрун вы рассмотрели ниже. – thelatemail