2013-04-09 5 views
7

Есть ли способ получить все функциональные параметры изнутри функции?Получить список всех функциональных параметров изнутри функции

match.call() не возвращает параметры со значениями по умолчанию, но не переопределенными. Например:

xf <- function (a, b="Hi", c=TRUE) { 
    print(as.list(match.call(expand.dots=FALSE))) 
} 

>xf(3) 
[[1]] 
xf 

$a 
[1] 3 

Я пишу пакет с функцией, которая вызывает существующую функцию, но я хочу, чтобы иметь возможность установить значения по умолчанию, которые не на существующей функции. (Я планирую использовать список из match.call, передав его в другую функцию с do.call и возвращает результат

Update:.. Интересный вопрос, который относится к способам S3 я создал новый метод S3, и используется @ Ответ Ferdinand.kraft as.list(environment(), all.names=TRUE) Аргумент all.names сохраняет имена, начинающиеся с . в списке. Оказывается, отправка метода добавляет несколько аргументов в среду функций, включая .Generic.Class.Method и некоторые другие. Это может вызвать проблемы, если вы передаете эти функции функции do.call. Один из других ответов может быть лучшим решением для всех, но мне нравится простота as.list(environment()).

+0

делает 'агд вы делаете то, что хотите? –

ответ

10

Вы также можете вернуть среду в начале функции:

xf <- function (a, b="Hi", c=TRUE) { 
    as.list(environment(), all=TRUE) 
} 

Результат:

> xf(a=1) 
$a 
[1] 1 

$b 
[1] "Hi" 

$c 
[1] TRUE 
+0

Мне нравится простота. – Seth

+0

Я тоже. :-) И это может стать еще проще, если имя аргумента не начинается с точки - или если вы не хотите передавать их вместе - в этом случае вы можете сбросить параметр 'all = TRUE'. –

4

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

например

xf <- function(a,b='Hi',c){ 
    # this gets the current definitions of `a`, `b`, and `c` 
    incall <-mget(ls()) 
    incall} 

xf(3) 
## $a 
## [1] 3 
## 
## $b 
## [1] "Hi" 
## 
## $c 

Вы можете использовать do.call(whatever, incall)

+0

Хорошее использование mget. – Seth

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