vapply中的FUN.VALUE参数

use*_*275 7 r list apply

我真的不得到FUN.VALUE的参数vapply。这是我的示例:

a = list(list(1,2), list(1), list(1,2,3))

# give the lengths of each list in a
sapply(a, length)
Run Code Online (Sandbox Code Playgroud)

现在,我尝试使用vapply代替sapply

# gives me same result as sapply
vapply(a, length, FUN.VALUE=1)

# same result, but why?
vapply(a, length, FUN.VALUE=1000)

# gives me error
vapply(a, length, FUN.VALUE="integer")

# gives me error
vapply(a, length, FUN.VALUE="vector")

# gives me error
vapply(a, length, FUN.VALUE=c(1,2))
Run Code Online (Sandbox Code Playgroud)

?vapply我了解,它FUN.VALUE可以是标量,向量或矩阵,并且用于匹配输出的类型。任何暗示为什么vapply会这样表现?

Gre*_*gor 6

vapply文档中,

FUN.VALUE(广义)向量;FUN 返回值的模板。查看详细信息'。

请注意,它说的是“返回值的模板”,而不是“描述返回值的字符串”。查看详细信息部分提供了更多指导:

此函数检查 的所有值FUN是否与 兼容FUN.VALUE因为它们必须具有相同的长度和类型。[强调]

您示例中的函数length()返回一个长度为 1 的数字(一个整数,如果我们想具体说明的话)。当您使用FUN.VALUE = 1,1与您期望的输出具有相同的长度和类型时,因此检查通过。当您使用FUN.VALUE = "integer","integer"是长度为 1 的字符向量时,因此长度检查通过但类型检查失败。

它继续:

(在排序逻辑 < 整数 < 双精度 < 复数内,类型可以提升为更高的类型,但不会降级。)

因此,如果您正在执行vapply一个可能返回整数或双精度值的函数,您应该确保指定类似FUN.VALUE = 1.0

文档继续讨论如何处理数组/矩阵。我不会在这里复制/粘贴它。