是否有可能为我提供一种可能的值列表 switch
功能。如果有人提供了错误的参数,我很乐意让所有内容自动更新。
我用 {}
对于每个条件,因为我将在我的函数中执行更多然后只是这个变量声明,我会在这个开关中做几件事。
switch(con,
val1={
filename <- 'SILAC-DML_with_PDF.R'
},
val2={
filename <- 'SILAC-DML_with_PDF.R'
},
stop(sprintf('"%s" is an unknown condition type, please use one of "%s".\n',
con, paste(c('val1','val2'), collapse=', '))))
我希望有一个列表,我可以粘贴名称,以获得可能的值。所以理想的解决方案有点像这样,但没有错误信息:-)
my_list <- list(val1=filename <- 'a.R',
val2=filename <- 'b.R')
switch(con,
my_list,
stop(sprintf('"%s" is an unknown condition type, please use one of "%s".\n',
con, names(my_list), collapse=', '))))
该 switch
函数是多余的,您可以直接对值列表进行子集化:
alternatives = list(val1 = 'SILAC-DML_with_PDF.R',
val2 = 'SILAC-DML_with_PDF.R')
result = alternatives[[con]]
if (is.null(result))
stop(…)
... switch
在R中是一个奇怪的野兽。我从来没有真正发现它有用。
如果您需要执行更复杂的操作,请考虑使用函数列表:
alternatives = list(
val1 = function () { message('foo') },
val2 = function () { message('bar') }
)
if (! con %in% names(alternatives))
stop(…)
result = alternatives[[con]]()
我不认为这可以通过巧妙实现 switch
但它当然可以包含在它自己的小功能中。请注意,与Hadley的答案不同,以上所有内容都避免了部分参数名称匹配,这是一个巨大的错误来源,并且属于从地球上消失的。
该 switch
函数是多余的,您可以直接对值列表进行子集化:
alternatives = list(val1 = 'SILAC-DML_with_PDF.R',
val2 = 'SILAC-DML_with_PDF.R')
result = alternatives[[con]]
if (is.null(result))
stop(…)
... switch
在R中是一个奇怪的野兽。我从来没有真正发现它有用。
如果您需要执行更复杂的操作,请考虑使用函数列表:
alternatives = list(
val1 = function () { message('foo') },
val2 = function () { message('bar') }
)
if (! con %in% names(alternatives))
stop(…)
result = alternatives[[con]]()
我不认为这可以通过巧妙实现 switch
但它当然可以包含在它自己的小功能中。请注意,与Hadley的答案不同,以上所有内容都避免了部分参数名称匹配,这是一个巨大的错误来源,并且属于从地球上消失的。
你可以使用而不是开关 match.arg()
和子集:
filenames <- c(
val1 = "a.R",
val2 = "b.R"
)
con <- match.arg(con, names(filenames))
filename <- filenames[[con]]
请注意,这允许部分匹配 con
,对您的用例可能有用也可能没有帮助。