函数默认参数和命名值
比方说,我有一个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') ... }
从你的例子我们有"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”
注意当我们提供一个不包含在选项集中的string时的行为。 我们得到了一个直观的错误消息,都是因为我们在函数参数中设置了选项。
我会使用一些常量的数据包:
.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"