R语言:vapply()中c(min=0, max=0)的作用及值不影响结果的原因
关于R中vapply函数FUN.VALUE参数的疑问解答
先看你给出的代码示例:
salaries <- list(leaders = c(250, 200), assistant = 100, members = c(300, 200, 180, 120, 100)) vapply(salaries, range, c(min=0, max=0))
1. c(min=0, max=0)到底是什么意思
这里的c(min=0, max=0)是传给vapply的**FUN.VALUE参数**,它的作用根本不是设置初始值,而是给vapply一个“模板”:
- 告诉它:你调用的
range函数,返回值得是数值型(因为你填的0是数值) - 告诉它:返回值得是2个元素(因为这个向量长度是2)
- 还给返回值的两个元素起了名字(
min和max)
你写的=0只是凑出来的一个符合要求的数值而已,vapply根本不会用这个数字本身。
2. 为啥改数值不影响结果
vapply的逻辑是:先通过FUN.VALUE确定好输出的结构(类型、长度、元素名),然后调用range计算每个列表元素的真实范围,最后把真实结果填充到这个预先确定的结构里。
range函数本来就会返回每个向量的最小值和最大值,vapply只是用你给的c(min=?, max=?)来确认“我要的是两个带min/max名字的数值”,至于你填的具体数字,会被range算出来的真实结果完全覆盖,所以不管你填0、0.1还是1000,最终结果都不会变。
举个反例验证
你可以试试改FUN.VALUE的类型,比如改成字符型:
vapply(salaries, range, c(min="0", max="0"))
这时候输出就会变成字符型的结果:
leaders assistant members min "200" "100" "100" max "250" "100" "300"
要是改成长度为1的模板,直接就报错了,因为range返回2个元素,不符合要求:
vapply(salaries, range, 0) # Error in vapply(salaries, range, 0) : # values must be length 1, but FUN(X[[1]]) result is length 2
内容的提问来源于stack exchange,提问作者Journey Kang
相关产品推荐
相关产品推荐

