2016-12-20 4 views
0

Я новичок в использовании match.arg для спецификации значения по умолчанию в R-функциях. И у меня есть запрос относительно поведения ниже.Ошибка при использовании match.arg для нескольких аргументов

trial_func <- function(a=c("1","9","20"),b=c("12","3"),d=c("55","01")){ 
    a <- match.arg(a) 
    b <- match.arg(b) 
    d <- match.arg(d) 
    list(a,b,d) 
} 
trial_func() 
# [[1]] 
# [1] "1" 
# 
# [[2]] 
# [1] "12" 
# 
# [[3]] 
# [1] "55" 

Когда я пытаюсь использовать match.arg для каждого аргумента, он работает, как ожидалось. Но когда я пытаюсь использовать lapply, чтобы уменьшить написанный код, это вызывает проблему ниже.

trial_func_apply <- function(a=c("1","9","20"),b=c("12","3"),d=c("55","01")){ 
    lapply(list(a,b,d), match.arg) 
} 
trial_func_apply() 

Ошибка в FUN (X [[я]], ...): 'аргумент' должен быть длиной 1

Я пропускаю что-то здесь?

ответ

0

После изучения немного, вам нужно передать аргумент, что вектор вашего характера является NULL, то есть

trial_func_apply <- function(a=c("1","9","20"),b=c("12","3"),d=c("55","01")){ 
    lapply(list(a,b,d), function(i)match.arg(NULL, i)) 
} 

trial_func_apply() 
#[[1]] 
#[1] "1" 

#[[2]] 
#[1] "12" 

#[[3]] 
#[1] "55" 
+0

Да, кажется, работает. Почему это происходит? – prateek1592

+0

Кажется, что ваши 'a',' b', 'c' представляют аргумент' choice' функции, а не 'arg'. Кроме этого, я не знаком с этой функцией, поэтому не могу сказать точно – Sotos