我剛剛注意到的require()
或library()
函數沒有version
的參數。當人們需要確保他們至少有一些最低版本的軟件包時,他們做了什麼,例如他們知道一些錯誤是固定的,或者某些功能可用,或者其他什麼?需要R包的最低版本
我知道的東西Depends
對於包的作者,但我正在尋找的東西在腳本中,互動的環境,org-mode
文件,代碼片段用等
我剛剛注意到的require()
或library()
函數沒有version
的參數。當人們需要確保他們至少有一些最低版本的軟件包時,他們做了什麼,例如他們知道一些錯誤是固定的,或者某些功能可用,或者其他什麼?需要R包的最低版本
我知道的東西Depends
對於包的作者,但我正在尋找的東西在腳本中,互動的環境,org-mode
文件,代碼片段用等
我不知道這樣的功能,但製作一個應該很容易。您可以將其基於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
,但基本結構保持不變。
你可以使用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
類的一個對象,其<
的行爲,因爲我們希望它喜歡(這使用它們比較兩個字符串時<
不會做字典排序)。
在閱讀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
感謝。看起來像'compareVersion()'是用於版本比較的正確選擇。 – 2012-02-16 18:16:13
真棒那功能在那裏,試圖自己做一些東西,但那不需要:)。 – 2012-02-16 18:23:40
@KenWilliams - 很好。我看了一下,並且在幫助頁面的聲明中被拋出軌道:「R軟件包版本號的形式爲'x.y-z'」。但它在實際上看起來像在'' - 「'和'」。「''上都是strsplit(),所以細節並不重要。 – 2012-02-16 20:58:31