> packageVersion("stats")
[1] ‘3.5.3’
返回的实体不是字符串。它是 package_version 类型的 S3 类
> class(packageVersion("stats"))
[1] "package_version" "numeric_version"
这个实体没有属性,没有名字,什么都没有。
> attributes(packageVersion("stats"))
$class
[1] "package_version" "numeric_version"
> names(packageVersion("stats"))
NULL
但不知怎的,这有效
> packageVersion("stats")$major
[1] 3
还有次要版本和补丁。问题是,如何以字符串形式获取完整版本?推论问题,为什么当我询问名称时,主要、次要和补丁不显示,以及如何查看该实体支持的名称的完整列表?
最佳答案
回答你的第一个问题:你可以做as.character(packageVersion(x))
。
第二个问题比较棘手:S3 类定义了自己的 $
运算符。我不知道为什么,但我们就在这里。
〉`$.package_version`
function (x, name)
{
name <- pmatch(name, c("major", "minor", "patchlevel"))
x <- unclass(x)
switch(name, major = vapply(x, "[", 0L, 1L), minor = vapply(x,
"[", 0L, 2L), patchlevel = vapply(x, "[", 0L, 3L))
}
<bytecode: 0x7fe3aa8fd000>
<environment: namespace:base>
这可能有一个很好的理由(也许很多的包版本号被生成和缓存,并且额外的空间节省是相关的),但是,老实说,它感觉过于聪明,没有充分的理由。代码也相当复杂——同样的事情可以写得更简单。
特别是,使用 switch
是不必要的且具有误导性,并且只是由于幸运的巧合才起作用,因为 name
不是名称,它是一个整数(pmatch
返回部分匹配条目的索引)。当然,绝对没有理由重复所有 vapply
代码。因此,以下代码执行相同的操作,只是更清晰:
`$.package_version` = function (x, name) {
index = pmatch(name, c("major", "minor", "patchlevel"))
vapply(unclass(x), `[`, integer(1L), index)
}
关于r - 如何在 packageVersion 之后以字符串形式获取完整版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59768157/