【问题标题】:Passing the `...` argument to lapply将 `...` 参数传递给 lapply
【发布时间】:2013-06-13 16:25:08
【问题描述】:

我在编写一个将... 作为参数并在函数体中包含lapply(..., length) 的函数时遇到问题。

目前,我的代码是(重要的部分在第 2 行):

paste1 <- function(..., sep = " ", collapse = NULL) {
    if(isTRUE(unique(as.logical(lapply(X = ..., FUN = length)))))
        if(length(sep)) paste(..., sep = sep, collapse = collapse)
        else paste0(..., collapse = collapse)
    else
        ""
}

问题在于lapply(X = ..., FUN = length) 部分。如果... 参数中有多个元素,它会尝试一次将length 应用于所有参数,这会引发错误,因为length 只有一个参数。

我不能使用像lapply(X = as.list(...), FUN = length) 这样的东西,因为... 的某些元素可能是NULL,而... 的列表表示会丢失信息。

我需要做的就是将length 应用于... 的各个元素,而不是先强制它们。

【问题讨论】:

  • 使用list 代替as.list?
  • 你能展示一个输入/使用的例子吗?如果我执行dots &lt;- list(...) 然后lapply(dots, length),我无法重现您的问题。
  • 谢谢,我不知道listas.list 不同。
  • @JonClaus 我什至没有看到 as.list(...) 甚至可以工作 - 对我来说失败了。
  • 你的意思是它抛出了一个错误还是它没有按预期工作?它似乎对我有用(意味着它不会引发错误),但我没有对其进行太多测试,因为我已经知道它在某些情况下会失败。

标签: r arguments lapply


【解决方案1】:

此版本使用dots &lt;- list(...),这似乎不会在此输入上失败:

> paste1(A = "foo", B = NULL, C = c("bar","foo"))
[1] ""

我没有查看您的函数正在尝试做什么,也没有查看这是否是有效输入,但lapply(X = dots, FUN = length) 可以满足您的需求,dots &lt;- list(...) 保留了 NULL

paste1 <- function(..., sep = " ", collapse = NULL) {
    dots <- list(...)
    if(isTRUE(unique(as.logical(lapply(X = dots, FUN = length)))))
        if(length(sep)) paste(dots, sep = sep, collapse = collapse)
        else paste0(dots, collapse = collapse)
    else
        ""
}

【讨论】:

  • 是否有任何as.list 方法实际使用... 参数?我似乎找不到任何这样做的。它只是为了“未来”的选择吗?
  • 确实 - 我无法重现 OP 提到的 as.list() 刚刚出错的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 2019-02-12
相关资源
最近更新 更多