Получить все параметры в виде списка
Предоставляет ли R объект/функцию/метод/ключевое слово для получения всех аргументов функции?
Используя пример:
function(a, b="default", ...)
предоставит a
и b
, а также ...
в среде функций. Существует ли утверждение, аналогичное list(...)
, которое также включало бы a
и b
в результате?
Или введите еще один способ: сокращение для list(a=a, b=b, ...)
, учитывая function(a, b, ...)
Ответы
Ответ 1
Я думаю, что вы хотите match.call
:
tmpfun <- function(a,b,...) {
print(as.list(match.call()))
print(as.list(match.call(expand.dots=FALSE)))
}
> tmpfun(a=1, b=2, c=3, d=4)
[[1]]
tmpfun
$a
[1] 1
$b
[1] 2
$c
[1] 3
$d
[1] 4
[[1]]
tmpfun
$a
[1] 1
$b
[1] 2
$...
$...$c
[1] 3
$...$d
[1] 4
Ответ 2
Одним из решений является использование:
tempf <- function(a, b = 2, ...) {
argg <- c(as.list(environment()), list(...))
print(argg)
}
tempf(1, c = 3)
$a
[1] 1
$b
[1] 2
$c
[1] 3
Создает именованный список значений аргументов.
Ответ 3
попробуйте args
функцию
Каковы аргументы для функции mean
?
> args(mean)
function (x, ...)
NULL
Как насчет функции lm
?
> args(lm)
function (formula, data, subset, weights, na.action, method = "qr",
model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE,
contrasts = NULL, offset, ...)
NULL
Если вы хотите получить список аргументов, попробуйте
as.list(args(lm))
Ответ 4
Я считаю, что вы ищете formals
:
formals(sd)
$x
$na.rm
[1] FALSE
И используя dput
, вы получите форму, указанную в вопросе:
dput(formals(sd))
list(x = , na.rm = FALSE)
Обратите внимание, что formals
не работает для примитивных функций, только замыкания.
Ответ 5
Наткнулся на этот вопрос, ища что-то связанное. Хотя я понимаю, что это уже несколько лет, ответы кажутся неудовлетворительными, и, похоже, не существует какого-либо готового решения вопроса.
Можно сделать (неэлегантное) обходное решение, используя комбинацию функций formals
и environment
. В приведенном ниже примере извлекаются аргументы из среды с использованием имен, извлеченных из формалей, а затем добавляется список многоточия. Если вы хотите иметь значения, которые были установлены во время вызова функции, установите для параметра orig_values значение TRUE. Функция включает только переменные неявно или явно заданные при вызове функции.
allargs <- function(orig_values = FALSE) {
# get formals for parent function
parent_formals <- formals(sys.function(sys.parent(n = 1)))
# Get names of implied arguments
fnames <- names(parent_formals)
# Remove '...' from list of parameter names if it exists
fnames <- fnames[-which(fnames == '...')]
# Get currently set values for named variables in the parent frame
args <- evalq(as.list(environment()), envir = parent.frame())
# Get the list of variables defined in '...'
args <- c(args[fnames], evalq(list(...), envir = parent.frame()))
if(orig_values) {
# get default values
defargs <- as.list(parent_formals)
defargs <- defargs[unlist(lapply(defargs, FUN = function(x) class(x) != "name"))]
args[names(defargs)] <- defargs
setargs <- evalq(as.list(match.call())[-1], envir = parent.frame())
args[names(setargs)] <- setargs
}
return(args)
}
tempf <- function(a, b = 2, ...) {
d <- 5
b <- 3
cat("Currently set values defined in call or formals\n")
print(allargs())
cat("Values as defined at the time of the call\n")
print(allargs(T))
}
tempf(1, c = 3)
Currently set values defined in call or formals
$a
[1] 1
$b
[1] 3
$c
[1] 3
Values as defined at the time of the call
$a
[1] 1
$b
[1] 2
$c
[1] 3