Я программирую на R и мне нужно проверить, являются ли все аргументы, предоставленные пользователем в списке params
, действительными аргументами для функции f
. Функция должна вернуть ошибку, если какие-либо именованные элементы params
не соответствуют именам аргументов f
. В настоящее время он реализован так:
if (is.null(names(params)) || any(!names(params) %in% names(formals(f)))) {
stop("names of params must match arguments of f")
}
Я столкнулся с проблемой при тестировании этого кода с помощью функции caret::train
. Функция train
имеет только один формальный аргумент, x
, поэтому names(formals(caret::train))
возвращает c('x','...')
. Однако метод S3 по умолчанию для caret::train
имеет дополнительные формальные аргументы. Как я могу программно проверить, совпадает ли именованный список, введенный пользователем, с аргументами функции, если они являются только аргументами для одного из методов, а не для самой функции? Это должно быть общее решение, которое должно работать для любой функции, а не только для train
.
Воспроизводимый пример
my_fun <- function(f, params) {
if (is.null(names(params)) || any(!names(params) %in% names(formals(f)))) {
stop("names of params must match arguments of f")
}
do.call(f, params)
}
library(caret)
# my_fun returns error: names of params must match arguments of f
my_fun(f = caret::train, params = list(x = data.frame(x = 1:10), y = rep(1,10), method = 'rf'))
# caret::train returns error: argument "y" is missing, with no default
my_fun(f = caret::train, params = list(x = data.frame(x = 1:10)))