2016-09-10 2 views
0

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

foo <- function (bar, baz, frobozz, quux = TRUE, frotz = 42) { 
      # etc. 
     } 

Если в теле этой функции, я хотел бы получить названный список фактических аргументов функции, полученные во время выполнения, я мог определить

actual_args <- list(bar = bar, baz = baz, frobozz = frobozz, quux = quux, 
        frotz = frotz) 

... но это назначение трудно поддерживать, так как она должна быть изменена каждый раз, когда аргумент будет добавлен, удален или переименован. (Не говоря уже о том, что это тоже утомительно).

Есть ли способ инициализировать actual_args, который останется неизменным относительно будущих изменений в сигнатуре функции?

+1

Вы должны использовать реальный случай, и ваши усилия при отладке, а не жаловаться на ответы, которые были точны в этом простом случае. Сое все будет невозможно. Например, существует часто повторяющийся запрос на получение имен значений, передаваемых с помощью lapply и sapply ... они просто недоступны. –

+0

@ 42: это совершенно несправедливо. Я не «жаловался»; Я просто изложил факты, если дополнительная информация приведет к пересмотренному или новому ответу. Я приму наилучший ответ на мой вопрос *, как я его разместил *, со временем, даже если он не работает для проблемы, с которой я действительно сталкиваюсь. У меня не было никакого способа узнать, что простой случай, который я опубликовал, будет отличаться от фактического случая, как это получается. Вопрос мне интересен только в том общем смысле, что я его разместил. Если решение для этого общего случая не работает для моей текущей проблемы, пусть будет так. – kjo

+0

Полностью несправедливо? Вы опубликовали чрезмерно упрощенный вопрос, а затем сказали, что решение не подходит для вашего фактического использования. Рекомендуемый способ получить разъяснения для ответа, который не является удовлетворительным, - опубликовать редактирование на свой вопрос, а не публиковать многокомпонентные комментарии. –

ответ

2

Вы можете использовать ls() в функции, чтобы получить список всех переменных, определенных. Если вы вызываете это сразу после запуска функции, вы получите список всех параметров. Затем вы можете использовать mget(), чтобы поместить эти значения в список. Например

foo<-function(a,b,c) { 
    mget(ls()) 
} 

Это будет работать с вашим do.call/mapply сценария

df <- data.frame(
    a=1:3, 
    b=letters[1:3], 
    c = runif(3)) 

do.call("mapply", c(foo, df)) 
# [,1]  [,2]  [,3]  
# a 1   2   3   
# b factor,1 factor,1 factor,1 
# c 0.7845643 0.0297852 0.3611791 
3

См ?match.call

foo <- function(a, b, c, d, ...) 
match.call() 

foo(1, 2, 3, bar, e=baz()) 
# foo(a = 1, b = 2, c = 3, d = bar, e = baz()) 

Это объект вызова, чей первый аргумент является именем функции, вызываемой (foo в данном случае). Другими аргументами являются неаудированные аргументы foo.

foo(1, 2, 3, bar, e=baz())[[1]] 
# foo 

foo(1, 2, 3, bar, e=baz())[[2]] 
# 1 

# the name of a variable 
foo(1, 2, 3, bar, e=baz())[[5]] 
# bar 

# a function call 
foo(1, 2, 3, bar, e=baz())[[6]] 
# baz() 
+0

Спасибо! Это работает для простого примера, который я дал в моем вопросе, но, к моему удивлению, он терпит неудачу в отношении более сложной проблемы, с которой я работаю. Фактическая функция, с которой я работаю, - это вызов, который вызывается через 'mapply', например:' do.call (mapply, c (foo, df)) ', где' df' - это 'data.frame', столбцы называются в соответствии с именами аргументов 'foo' ... В этих условиях значение, возвращаемое' match.call', имеет такие элементы, как 'dots [[1L]] [[1L]]' и т. д. . ... – kjo

+0

(продолжение) Если я прекратил выполнение сразу после присвоения 'actual_args' (используя' browser() ') и попытаюсь оценить' dots', я получаю 'Error: object 'dots' not found', поэтому я понятия не имею, что это за «точки». (Документация для 'match.call' ничего не говорит об этом.) – kjo

+0

В браузере вы можете попробовать следующее:' dts <- list (...) 'для принудительной оценки значения многоточия в этой точке. –

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