Подтвердить что ты не робот

Параметры аргументов по умолчанию и именованные значения

Скажем, у меня есть функция R, в которой аргументы могут быть одним из нескольких предопределенных именованных значений (один из которых является значением по умолчанию) или пользовательским символьным вектором. Как это реализовать, не полагаясь на имена магических значений или другой флаг?

#allow use of predefined subsets or pass their own list
bratPack<-function(members='CORE',...){
  if (members=='CORE')
    members<-c('Emilio Estevez','Anthony Michael Hall','Rob Lowe','Andrew McCarthy','Demi Moore','Judd Nelson','Molly Ringwald','Ally Sheedy')
  else if (members=='ALL')
    members<-c('Emilio Estevez','Anthony Michael Hall','Rob Lowe','Andrew McCarthy','Demi Moore','Judd Nelson','Molly Ringwald','Ally Sheedy','James Spader','Robert Downey, Jr.','Jon Cryer', 'John Cusack', 'Kevin Bacon', 'Jami Gertz', 'Mary Stuart Masterson', 'Matthew Broderick', 'Sean Penn', 'Kiefer Sutherland')
  ...
}
4b9b3361

Ответ 1

В вашем примере у нас есть выбор "CORE" и "ALL". Если это два параметра, то мы укажем их в определении функции для аргумента 'members'. Например:.

foo <- function(x, members = c("CORE", "ALL")) {
    ## do something
}

Это определение функции устанавливает допустимые значения аргумента 'members' со значением по умолчанию "CORE", поскольку это первая именованная опция.

Код, который используется внутри тела функции, match.arg(), как уже упоминал @Joris, но поскольку мы установили функцию вверху, как указано выше, мы можем просто использовать только match.arg(members}.

Итак, мы можем написать foo как:

foo <- function(x, members = c("CORE", "ALL")) {
    ## evaluate choices
    members <- match.arg(members)
    ## do something
    print(members)
}

Что мы используем так:

> foo()
[1] "CORE"
> foo(members = "CORE")
[1] "CORE"
> foo(members = "ALL")
[1] "ALL"
> foo(members = "3rdRate")
Error in match.arg(members) : 'arg' should be one of "CORE", "ALL"

Обратите внимание на поведение, когда мы поставляем строку, не включенную в набор параметров. Мы получаем интуитивное сообщение об ошибке, потому что мы настраиваем параметры в аргументах функции.

Ответ 2

Я бы использовал некоторый постоянный файл данных где-то в пакете:

.mdata <- data.frame(
    CORE= c(TRUE,FALSE,TRUE),
    OLD = c(TRUE,TRUE,FALSE),
    ALL = c(TRUE,TRUE,TRUE),
    row.names=c("John Doe", "Jan Janssen", "Piet Peters")
)

bratPack<-function(members='CORE',...){
  m.tmp <- try(
         match.arg(members,names(.mdata),several.ok=T),
         silent=T) 

  if(!is(m.tmp,"try-error"))
    members <- rownames(.mdata)[.mdata[[members]]]

  print(members)
}

> bratPack('CORE')
[1] "John Doe"    "Piet Peters"

> bratPack('Jan Janssen')
[1] "Jan Janssen"

> bratPack(c("John Doe","Dick Dickers"))
[1] "John Doe"     "Dick Dickers"