R 警告“length(x) = 2 > 1”强制转换为“逻辑(1)”

dor*_*ran 14 r

使用 R 4.1.3 我观察到:

var <- 0
> if(is.data.frame(var) || is.vector(var)) var <- as.matrix(var)
> is.null(var) || (!is.matrix(var) && var == 0) || (dim(var)==c(1,1) && var[1,1]==0)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

但是,在 R 4.2.1 中,我观察到同一代码上的警告

> var <- 0
> if(is.data.frame(var) || is.vector(var)) var <- as.matrix(var)
> is.null(var) || (!is.matrix(var) && var == 0) || (dim(var)==c(1,1) && var[1,1]==0)
[1] TRUE
Warning message:
In dim(var) == c(1, 1) && var[1, 1] == 0 :
  'length(x) = 2 > 1' in coercion to 'logical(1)'
Run Code Online (Sandbox Code Playgroud)

很难在这里找到根本原因。对于现在发生这种情况的原因以及好的解决方案有什么想法吗?

李哲源*_*李哲源 28

dim(var) == c(1,1)给出两个TRUE. 请参阅下面的R新闻。可能的替代品是

identical(dim(var), c(1L, 1L))
all(dim(var) == c(1,1))
Run Code Online (Sandbox Code Playgroud)

之前我们被告知,&&并且||可以安全使用,if ()因为它们会默默地返回一个 TRUE 或 FALSE。但现在它会警告你。这实际上使检测错误变得更容易,所以我对这一更改感到满意。

不幸的是,此更改影响了一些R包(例如,请参阅:由于“if”错误,包停止工作:条件长度 > 1)。结果,以前运行顺利的代码突然抛出警告甚至错误。

改变