我正在使用一个名为PIMixture
(see 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版本的变化而发生的,或者为什么会发生这个问题。
1条答案
按热度按时间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.matrix
或is.numeric
来代替呢?(如果没有看到函数的逻辑,很难说什么测试是合适的。)另见Martin Mächler 2019年的博客文章:When you think
class(.) == *
, think again!