2015-01-11 10 views
3

У меня есть основная функция, которая передает аргументы другой функции, которая использует rpart для генерации модели. Я хотел бы иметь возможность указать rpart.control из основной функции с помощью эллипса. Если нет cp или minbucket, то я хотел бы использовать значения по умолчанию для этих двух параметров.Передача аргументов функции с использованием эллипса и установка значения по умолчанию для некоторых, если они не существуют

До сих пор я не был успешным - см. Мой проект ниже. В настоящее время функция жалуется, что не найдено cp. Я понимаю, почему, но не могу понять, как применять умолчания, если пользователь не предоставил собственные элементы управления.

require(rpart) 

a <- function(df, ...) { 
    b(df, ...) 
} 

b <- function(df, ...) { 
    if (is.null(cp)) cp <- 0.001 
    if (is.null(minbucket)) minbucket = nrow(df)/20 
    rcontrol <- rpart.control(cp = cp, minbucket = minbucket, ...) 
    rcontrol 
} 


a(iris) # no controls set my defaults for cp and minbucket 
a(iris, cp = 0.123) # set cp, use my default for minbucket 
a(iris, cp = 0.123, minbucket = 100) # set cp, and minbucket 
a(iris, maxcompete = 3) # use my defaults for cp and minbucket, but pass maxcompete 

ответ

4

Вот небольшая поправка к вашей функции: применять list(...) первый.

b <- function(df, ...) { 
    l <- list(...) 
    if (is.null(l$cp)) l$cp <- 1 
    if (is.null(l$minbucket)) l$minbucket <- 2 
    print_all(l$cp, l$minbucket, ...) 
} 

print_all <- function(...) { 
    print(list(...)) 
} 

Запустите свои примеры, чтобы убедиться, что все значения по умолчанию установлены.

0

это может работать для вас

a <- function(df, cp = NULL, minbucket = NULL, ...) { 
    if (is.null(cp)) cp <- 0.001 
    if (is.null(minbucket)) minbucket <- nrow(df)/20 

    rpart.control(cp = cp, minbucket = minbucket, ...) 
} 

хорошего источника для более подробной информации (Advanced R Хэдли Уикхемом) http://adv-r.had.co.nz/Functions.html

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

  • Нет связанных вопросов^_^