2017-07-30 100 views
0

這裏是我的功能:R:匹配變量而不是函數參數省略號

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

函數調用:

print.log('listing x files') 

錯誤消息: 錯誤,如果(print.flag)打印(粘貼(as.character(Sys.time()), 「 - 」,: 參數不是解釋成邏輯

這裏是值print.flag成立:

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

我知道我想推送到省略號的字符串全部匹配到print.flag變量。

我的問題:爲什麼是這種行爲,我該如何修復它以達到預期的效果? (意思是說,除非我特別聲明print.flag變量,否則所有函數參數都會去省略號)

回答

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端口。它允許使用「日誌級別」對日誌進行環境控制,並定義默認格式(在您的情況下,前面的時間戳等)。

+0

@kamashay如果我的答案解決了您的問題,請接受答案以表明您的問題已得到充分解答。 – cole

+0

很好的回答和很棒的評論。這確實解決了這個問題。 – kamashay

相關問題