在旧的R包中,由于class(x)同时返回矩阵和数组而导致的错误-这是新的吗?

pepwfjgg  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在使用一个名为PIMixturesee here)的旧软件包,它在代码的各个位置给我带来了很多错误。它们看起来都像这样或类似(以下行实际上来自可复制的示例):

> 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

字符串
经过调查我发现,

> class(mat2)
[1] "matrix" "array"


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

ljo96ir5

ljo96ir51#

行为在R版本4.0.0或4.2.0中发生了变化,这取决于您认为的“变化”。news(Version == "4.0.0")说:
matrix对象现在也继承自类"array",例如,class(diag(1))c("matrix", "array")。这会错误地假设class(matrix_obj))的长度为1,从而使代码无效。
news(Version == "4.2.0")说:
在条件长度大于1的情况下调用if()while()将给出错误而不是警告。因此,环境变量_R_CHECK_LENGTH_1_CONDITION_不再有任何作用。
为什么不使用is.matrixis.numeric来代替呢?(如果没有看到函数的逻辑,很难说什么测试是合适的。)
另见Martin Mächler 2019年的博客文章:When you think class(.) == * , think again!

相关问题