2012-02-16 102 views
19

我剛剛注意到的require()library()函數沒有version的參數。當人們需要確保他們至少有一些最低版本的軟件包時,他們做了什麼,例如他們知道一些錯誤是固定的,或者某些功能可用,或者其他什麼?需要R包的最低版本

我知道的東西Depends對於包的作者,但我正在尋找的東西在腳本中,互動的環境,org-mode文件,代碼片段用等

回答

7

我不知道這樣的功能,但製作一個應該很容易。您可以將其基於sessionInfo()packageVersion()。加載腳本所需的包後,您可以從那裏收集包號。來檢查版本號的功能看起來像(僞代碼,因爲我沒有時間,現在):

check_version = function(pkg_name, min_version) { 
    cur_version = packageVersion(pkg_name) 
    if(cur_version < min_version) stop(sprintf("Package %s needs a newer version, 
       found %s, need at least %s", pkg_name, cur_version, min_version)) 
} 

調用它會像:

library(ggplot2) 
check_version("ggplot2", "0.8-9") 

你仍然需要將版本號解析爲允許比較的東西cur_version < min_version,但基本結構保持不變。

+3

感謝。看起來像'compareVersion()'是用於版本比較的正確選擇。 – 2012-02-16 18:16:13

+0

真棒那功能在那裏,試圖自己做一些東西,但那不需要:)。 – 2012-02-16 18:23:40

+0

@KenWilliams - 很好。我看了一下,並且在幫助頁面的聲明中被拋出軌道:「R軟件包版本號的形式爲'x.y-z'」。但它在實際上看起來像在'' - 「'和'」。「''上都是strsplit(),所以細節並不重要。 – 2012-02-16 20:58:31

14

你可以使用packageVersion()

packageVersion("stats") 
# [1] ‘2.14.1’ 

if(packageVersion("stats") < "2.15.0") { 
    stop("Need to wait until package:stats 2.15 is released!") 
} 
# Error: Need to wait until package:stats 2.15 is released! 

這工作,因爲packageVersion()返回package_version類的一個對象,其<的行爲,因爲我們希望它喜歡(這使用它們比較兩個字符串時<不會做字典排序)。

11

在閱讀Paul的僞代碼後,下面是我寫的函數。

use <- function(package, version=0, ...) { 
    package <- as.character(substitute(package)) 
    library(package, ..., character.only=TRUE) 
    pver <- packageVersion(package) 
    if (compareVersion(as.character(pver), as.character(version)) < 0) 
    stop("Version ", version, " of '", package, 
     "' required, but only ", pver, " is available") 
    invisible(pver) 
} 

它的功能基本相同,library(),但需要一個額外的version參數:

> use(plyr, 1.6) 
> use(ggplot2, '0.9') 
Error in use(ggplot2, "0.9") : 
    Version 0.9 of 'ggplot2' required, but only 0.8.9 is available