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
这个问题是指这个
其中一个解决方案是:
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
andF
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