FALSE 与 F:错误 mapply 的 SIMPLIFY 参数:在 SIMPLIFY=F 中

FALSE vs. F: Error mapply's SIMPLIFY argument: in SIMPLIFY=F

这个问题是指这个

其中一个解决方案是:

a <- list(3,5,7)
l <- list(c(1,2,3), c(2,1,4), c(4,7,6))

mapply(c, l, a, SIMPLIFY=F)

如果我尝试在我的机器上应用它,我会收到错误消息:

Error in SIMPLIFY == "array" : 
  comparison (1) is possible only for atomic and list types

如果我使用这个 -> 没有错误:

mapply(c, l, a, SIMPLIFY = FALSE)

我想了解为什么在使用SIMPLIFY =F and not in SIMPLIFY = FALSE时会出现错误。

我正在使用 rstudio - 云:

> version
               _                           
platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          4                           
minor          1.3                         
year           2022                        
month          03                          
day            10                          
svn rev        81868                       
language       R                           
version.string R version 4.1.3 (2022-03-10)
nickname       One Push-Up  

在新的 R 会话中,此错误不可重现:

a <- list(3,5,7)
l <- list(c(1,2,3), c(2,1,4), c(4,7,6))

mapply(c, l, a, SIMPLIFY=F)
#> [[1]]
#> [1] 1 2 3 3
#> 
#> [[2]]
#> [1] 2 1 4 5
#> 
#> [[3]]
#> [1] 4 7 6 7

但是,我们可以通过用函数覆盖 F 来复制您的错误:

F <- function() {}; mapply(c, l, a, SIMPLIFY=F)
#> Error in SIMPLIFY == "array" : 
#>   comparison (1) is possible only for atomic and list types

这表明您在搜索路径的某处有一个名为 F 的函数。

我们可以猜测它是一个函数而不是数据框或向量的原因是,如果有一些东西被传递给 SIMPLIFY 而不是,我们只会得到这个错误为 == 运算符定义了一个方法,函数是最有可能的候选者(特别是因为它被称为 F

如果您查看 mapply 的源代码,您会发现 SIMPLIFY 参数被传递给 simplify2array 当且仅当它不计算为原子 FALSE:

function (FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE) 
{
    FUN <- match.fun(FUN)
    dots <- list(...)
    answer <- .Internal(mapply(FUN, dots, MoreArgs))
    if (USE.NAMES && length(dots)) {
        if (is.null(names1 <- names(dots[[1L]])) && is.character(dots[[1L]])) 
            names(answer) <- dots[[1L]]
        else if (!is.null(names1)) 
            names(answer) <- names1
    }
    if (!isFALSE(SIMPLIFY)) 
        simplify2array(answer, higher = (SIMPLIFY == "array"))
    else answer
}

如果它不是原子 FALSE,则使用 == 运算符测试 SIMPLIFY 参数是否与字符串 "array" 相等。如果无法测试对象是否与字符串相等,我们将得到此错误。

我认为这个问题很好地说明了为什么在 R 中永远不要使用 F 作为变量名,以及为什么应该始终使用 FALSE 而不是 F

正如 OP 提到的,他们没有在控制台中创建任何函数 F,它可能来自加载 collapse

library(collapse)

然后我们检查 ?F

flag is an S3 generic to compute (sequences of) lags and leads. L and F are wrappers around flag representing the lag- and lead-operators...

因此,错误可以重现

> mapply(c, l, a, SIMPLIFY=F)
Error in SIMPLIFY == "array" : 
  comparison (1) is possible only for atomic and list types