【问题标题】:Can vapply() be used with a variable-length FUN.VALUE?vapply() 可以与可变长度的 FUN.VALUE 一起使用吗?
【发布时间】:2017-08-06 15:18:04
【问题描述】:

我正在尝试关注good practice 并在函数内部使用vapply() 而不是sapply(),但是发现vapply() 的类型检查在需要固定长度时太不灵活了。

假设我想要这样的东西:

list1 <- list(l1_one = 1:3, l1_two = letters[1:3])
list2 <- list(l2_one = 4:6, l2_two = letters[4:6], l2_three = 10:12)
list_12 <- list(list1, list2)

sapply(list_12, names)
# [[1]]
# [1] "l1_one" "l1_two"
# 
# [[2]]
# [1] "l2_one"   "l2_two"   "l2_three"

有没有办法允许可变长度,但检查返回是否为“字符”模式,并且长度至少为一个?显然这不起作用:

vapply(list_12, names, character(2))
# Error in vapply(list_12, names, character(2)) : values must be length 2,
# but FUN(X[[2]]) result is length 3

【问题讨论】:

  • 不,使用 vapply 是不可能的。如果您想要检查,请编写一个包含它们的函数。

标签: r sapply


【解决方案1】:

sapply 是不安全的,因为它的返回类型不稳定。如果你知道你的返回类型,你可以安全地使用vapply。如果不是,就像您的情况一样,只需使用 lapply 代替。

你的例子:

list1 <- list(l1_one = 1:3, l1_two = letters[1:3])
list2 <- list(l2_one = 4:6, l2_two = letters[4:6], l2_three = 10:12)
list_12 <- list(list1, list2)

lapply(list_12, names) # always list() return type

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2013-10-12
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多