2013-09-03 3 views
2

Я хотел бы включить в мои R-функции общий подход, чтобы проверить, указаны ли все параметры. Я мог бы сделать это, используя missing(), но я не хочу указывать имена параметров. Я хочу, чтобы он работал внутри любой произвольной функции. Более конкретно, я хочу, чтобы иметь возможность просто копировать/вставлять этот код в любую функцию, которая у меня есть, без ее изменения, и будет проверять, указаны ли параметры. Одним из примеров может быть следующая функция:R проверить, указаны ли параметры: общий подход

tempf <- function(a,b){ 
argg <- as.list((environment())) 
print(argg) 
} 

tempf(a=1, b=2) 
+0

Лично я на самом деле не задаю вопрос. Не могли бы вы показать ситуацию, которая не подходит для решения проблемы? Я думаю, это поможет. –

+1

Функция не будет работать, если не все параметры предоставлены (по умолчанию или пользователем). – PascalVKooten

+0

Рамка оценки будет иметь только объекты, соответствующие аргументам * not *, которые соответствуют «...». Если вы не возражаете об этом, вы можете сравнить каждый локальный объект с «пустым символом»: '(function (a, b, ...) sapply (as.list (environment()), same, bquote())) (а = 1) '. –

ответ

4

Попробуйте эту функцию:

missing_args <- function() 
{ 
    calling_function <- sys.function(1) 
    all_args <- names(formals(calling_function)) 
    matched_call <- match.call(
    calling_function, 
    sys.call(1), 
    expand.dots = FALSE 
) 
    passed_args <- names(as.list(matched_call)[-1]) 
    setdiff(all_args, passed_args) 
} 

Пример:

f <- function(a, b, ...) 
{ 
    missing_args() 
} 

f() 
## [1] "a" "b" "..." 
f(1) 
## [1] "b" "..." 
f(1, 2) 
## [1] "..." 
f(b = 2) 
## [1] "a" "..." 
f(c = 3) 
## [1] "a" "b" 
f(1, 2, 3) 
## character(0) 

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

args_not_passed <- setdiff(all_args, passed_args) 
    if(length(args_not_passed) > 0) 
    { 
    stop("The arguments ", toString(args_not_passed), " were not passed.") 
    } 
+0

Спасибо большое !!! Это именно то, что мне нужно – aymer

+0

Рад быть полезным. Если это ответит на ваш вопрос, нажмите на галочку рядом с полем для оценки, чтобы отметить его как решение. –

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