2016-05-23 3 views
2

Я стараюсь работать с аргументом многоточия (...) в R и иметь некоторые проблемы.Как разрешить R распознавать вектор аргументов в многоточии?

Я пытаюсь передать некоторые аргументы по умолчанию в начале функции, не загромождая область аргументов функции, используя ... и переопределяя, если они там предоставлены. Но как-то многоточие аргумент, кажется, не забрать мой полного вектора

test <- function(dat, 
       # I don't want to have to put default col, 
       # ylim, ylab, lty arguments etc. here 
       ...) { 
    # but here, to be overruled if hasArg finds it 
    color <- "red" 
    if(hasArg(col)) { # tried it with both "col" and col 
    message(paste("I have col:", col)) 
    color <- col 
    } 
    plot(dat, col = color) 
} 

Функция вызова:

test(data.frame(x = 1:10, y = 11:20), col = c("purple", "green", "blue")) 

Выдает ошибку:

Error in paste("I have col:", col) (from #8) : 
    cannot coerce type 'closure' to vector of type 'character' 

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

+1

Похоже, вам нужно читать [некоторые расширенные R] (http://adv-r.had.co.nz/Computing-on-the-language.html). Найдите «точки» на странице, которую я связал. – Gregor

ответ

4

Вы должны сделать это, сбор/упаковка ... в список, если вы хотите использовать его содержимое внутри функции.

test <- function(dat, 
       # I don't want to have to put default col, 
       # ylim, ylab, lty arguments etc. here 
       ...) { 
    opt <- list(...) 
    color <- "red" 
    if(!is.null(opt$col)) { # tried it with both "col" and col 
    message(paste("I have col:", opt$col)) 
    color <- opt$col 
    } 
    plot(dat, col = color) 
} 

test(data.frame(x = 1:10, y = 11:20), col = c("purple", "green", "blue")) 

Проблема в исходном коде, что args() или hasArg() работает только для формальных аргументов в вызове функции. Поэтому, когда вы проходите в col = c("purple", "green", "blue"), hasArg() знает, что есть формальный аргумент col, но не оценил его. Поэтому внутри функции нет текущей переменной col (вы можете использовать отладчик, чтобы проверить это). Интересно, что есть функция col() из пакета R base, поэтому эта функция передается в paste. В результате вы получаете сообщение об ошибке при попытке конкатенации символьной строки и «закрытия».