r:函数参数匹配变量而不是省略号

时间:2017-07-30 09:06:38

标签: r function ellipsis

这是我的功能:

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

函数调用:

print.log('listing x files')

错误讯息:     if(print.flag)打印出错(粘贴(as.character(Sys.time()),“ - ”,:       参数不能解释为逻辑

这是print.flag的值:

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

据我所知,我想推送到省略号的字符串与print.flag变量完全匹配。

我的问题:为什么这个行为,我如何修复它以达到预期的效果呢? (意思是,所有函数参数都将转到省略号,除非我专门声明了print.flag变量)

1 个答案:

答案 0 :(得分: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端口。它允许使用&#34;记录级别&#34;进行环境控制。并定义默认格式(在您的情况下,前面的时间戳等)。