由于 class(x) 返回矩阵和数组,旧 R 包中出现错误 - 这是新的吗?

tom*_*mka 2 arrays r version matrix

我正在使用一个名为PIMixture请参阅此处)的旧包,它在代码的各个位置引发了很多错误。它们看起来都像这样或类似(以下几行实际上来自可重现的示例):

> library(PIMixture)
> data(PIdata)
> model<-"C_CIN3PLUS+L_CIN3PLUS+R_CIN3PLUS~RES_HPV16"
> fit1<-PIMixture(p.model=model,data=PIdata1, model="logistic-Weibull")
Error in if (class(mat2) == "numeric") { : the condition has length > 1
Run Code Online (Sandbox Code Playgroud)

经过调查我发现

> class(mat2)
[1] "matrix" "array" 
Run Code Online (Sandbox Code Playgroud)

因此 if 子句返回错误。我不敢相信这是开发包时的一个问题,因为它会被注意到。因此我想知道在 R 的早期版本中是否class(mat2)可能评估为"Matrix"only,因此长度为 1。我可以在源代码中应用修复,PIMixture如下所示:class(mat2)[1]。不太好,但是这个包就可以工作了。我想知道这个问题是否是由于 R 跨版本的更改而发生的,或者为什么会发生这个问题。

Mik*_*gan 5

R 版本 4.0.0 或 4.2.0 中的行为发生了变化,具体取决于您认为的“更改”。 news(Version == "4.0.0")说:

\n
\n

matrix对象现在也继承自 class "array",因此例如class(diag(1))is c("matrix", "array")。假设长度为一,这会错误地使代码无效class(matrix_obj))

\n
\n

news(Version == "4.2.0")说:

\n
\n

在长度大于 1 的条件下调用if()orwhile()会给出错误而不是警告。因此,环境变量_R_CHECK_LENGTH_1_CONDITION_不再有任何影响。

\n
\n

为什么不使用is.matrixoris.numeric代替呢?(在没有看到函数逻辑的情况下,很难说哪种测试是合适的。)

\n

另请参阅 Martin M\xc3\xa4chler\ 2019 年的博文:当您思考时class(.) == *,请再思考一下!

\n