【问题标题】:using a list of possible values in a switch command在 switch 命令中使用可能值的列表
【发布时间】:2015-07-21 11:53:53
【问题描述】:

是否可以为我的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=', '))))

【问题讨论】:

    标签: r switch-statement


    【解决方案1】:

    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 中做更多的事情,或者这至少是我的计划 :-) 这就是为什么我使用了这种奇怪的结构,但你的解决方案也很有趣。
    • @drmariod 啊,有效的评论。在这种情况下,我建议使用函数列表和子集。
    • 所以只调用列表中的函数?!嗯,听起来像是我正在寻找的解决方案......我稍微更新了我的问题。
    • 我认为这是完美的。不再使用switch了!之前没有考虑过列表中的这些匿名函数。完美的。您可能会重新排列您的答案并将列表/功能解决方案放在顶部。 :-) 谢谢
    【解决方案2】:

    您可以使用 match.arg() 和子集来代替 switch:

    filenames <- c(
      val1 = "a.R",
      val2 = "b.R"
    )
    con <- match.arg(con, names(filenames))
    
    filename <- filenames[[con]]
    

    请注意,这允许部分匹配 con,这可能对您的用例有帮助,也可能没有帮助。

    【讨论】:

    • 我稍微更新了我的问题。文件名只是一个占位符,我将在开关中执行更多命令。
    • 呃,@hadley 的第一个回答...我感到很荣幸 :-)
    猜你喜欢
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    相关资源
    最近更新 更多