【问题标题】:r: function arguments matched to variables rather then ellipsisr:函数参数匹配变量而不是省略号
【发布时间】:2017-07-30 09:06:38
【问题描述】:

这是我的功能:

print.log <- function(print.flag = T,...){
  if(print.flag)
    print(paste(as.character(Sys.time()),' - ',...))
}

函数调用:

print.log('listing x files')

错误信息: if (print.flag) print(paste(as.character(Sys.time()), " - ", 中的错误: 论点不能解释为合乎逻辑的

这是 print.flag 的值:

Browse[2]> print.flag
[1] "listing x files"

我知道我想推到省略号的字符串毕竟与 print.flag 变量匹配。

我的问题:为什么会出现这种行为,我该如何解决它以达到预期的效果? (意思是,所有函数参数都将转到省略号,除非我特别声明了 print.flag 变量)

【问题讨论】:

    标签: r function ellipsis


    【解决方案1】:

    这里的解决方案实际上很简单:切换参数的顺序。

    print.log <- function(..., print.flag = T){
      if(print.flag)
        print(paste(as.character(Sys.time()),' - ',...))
    }
    

    这样做的原因是函数调用中的未命名参数按照它们在函数定义中的命名顺序进行匹配。直到您点击 ... 才会发生这种情况,它会贪婪地吞噬所有未命名(或命名但未提及)的参数。

    print.log("a", "b", "c")
    #> [1] "2017-07-30 05:21:08  -  a b c"
    
    print.log("a", print.flag = F)
    
    print.log("a", print.flag = T, "b")
    #> [1] "2017-07-30 05:21:08  -  a b"
    
    print.log("a", one = "b", two = "c")
    #> [1] "2017-07-30 05:21:08  -  a b c"
    

    注意:也许是为了回答一些你没有问过的问题。

    小心使用. 作为命名约定(尽管许多基本的R 函数不遵循此建议),因为.S3 用于类行为。更多阅读here.

    另外,您可能会查看 logging 包,它是流行的 python 日志记录包的 R 端口。它允许使用“日志记录级别”对日志记录进行环境控制并定义默认格式(在您的情况下为前面的时间戳等)。

    【讨论】:

    • @kamashay 如果我的回答解决了您的问题,请接受该回答以表明您的问题已得到充分回答。
    • 很好的答案和很好的 cmets。这确实解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2014-04-06
    • 2012-10-11
    • 2013-04-25
    • 2011-03-09
    • 2018-06-21
    相关资源
    最近更新 更多