r - 如何在 packageVersion 之后以字符串形式获取完整版本?

标签 r

 > 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/

相关文章:

R::data.table:使用先前的平衡和逐行迭代按组生成运行平衡

r - 如何在ggplot2中更改自定义图例中的线条角度

r - 如何使用 quantmod 在新图中叠加多个 TA?

r - `rowname` - 矩阵列表

r - 如何使用 geom_boxplot 绘制均值而不是中值?

r - data.frames 列表中元素的平均值

r - 在ggmap中使用图像作为点图标

R Shiny - 将数据传递到下拉输入选择器

r - 执行类似于 R 中 Excel 的 countif 的操作,但有条件

r - geom_text 更改小平面图的因子顺序