【问题标题】:How to get the value of list(...) in R and S functions如何在 R 和 S 函数中获取 list(...) 的值
【发布时间】:2013-06-03 01:22:11
【问题描述】:

我对@9​​87654321@ 在 R 和 S-plus 中的工作方式感到困惑。对于以下代码

pp <- function(x, ...) { print( length( list(...)))}
pp(1,,,1)

在 S-Plus 中,它可以工作,但在 R 中,它给出“Error in print(length(list(...))) : argument is missing, with no default

我对它在 R 中的工作原理以及如何在 R 函数中获取 list(...) 的值更感兴趣。

【问题讨论】:

  • 我只是建议您删除现有版本中多余的逗号:pp(1,1) 然后pp(1,2,3) 应该返回 1 和 2。

标签: r s


【解决方案1】:

我不确定为什么在 S-plus 中允许使用这种语法,但在 R 中却不允许。

不过,这里是一些具有基本相同效果的 R 代码:

pp <- function(x, ...) {
    print(length(as.list(match.call(expand.dots=FALSE))[["..."]]))
}
pp(1,,,1)
# [1] 3

或者,使用技巧from here

ppp <- function(x, ...) {
    print(length(substitute(...())))
}
ppp(1,,,1)
# [1] 3

【讨论】:

    【解决方案2】:

    您不能在dotsdots 之后的任何参数中使用未命名的(编辑:... 和缺失)参数,如果这些参数打算在 arg 列表中匹配。未命名参数自动发生的位置匹配仅在点之前的命名参数(在 arg 列表中)的典型参数处理中“起作用”。

    > pp1 <- function(x, ...) { length( list(...))}
    > pp1(1,z=NULL,xx=NULL,1)
    [1] 3
    > pp2 <- function(x, z, ...) { length( list(...))}
    > pp2(1,z=NULL,xx=NULL,1)
    [1] 2
    > pp3 <- function(x, z, ...) { length( list(...))}
    > pp3(1, ,xx=NULL,1)
    [1] 2
    
    > pp <- function(x, ...) { length( list(...))}
    > pp(1, , xx=NULL, 1)
    Error in pp(1, , xx = NULL, 1) : argument is missing, with no default
    

    阅读match.call的帮助页面,第二种“常用情况”描述为:

    将大部分调用传递给另一个函数,通常是model.frame。这里常见的习惯用法是expand.dots = FALSE,匹配调用的...元素被移除。

    参数匹配的顺序(未规避时)在第 4.3.2 节“参数匹配”中描述:

    1. 位置匹配。任何不匹配的形式参数都按顺序绑定到未命名的提供参数。如果有一个“...”参数,它将占用剩余的参数,无论是否标记。

    如果任何参数仍然不匹配,则会声明错误。

    【讨论】:

    • 我不确定你在这里所说的“你不能在点中使用未命名的参数”是什么意思——显然你可以,正如 Josh 上面所展示的......?
    • 他的函数并没有真正使用标准的参数列表机制。它将函数调用视为未计算的表达式。
    • 我可能错过了什么。好吧,这不是标准的,但那又怎样?因为他以后可以以任何他喜欢的方式处理该列表,包括但不限于所有标准处理
    • @eddi:正如最初所说,我同意我错了。我正在修改我的答案,但可能不符合您的喜好,因为我认为 match.call(expand.dot=FALSE) 并不是真正“使用”点机制,而是“在背后四处走动”。
    • 好的...您可能想查看alist 作为一个函数示例,该函数旨在完全执行您认为不应该执行的操作 - 尽管它看起来像那个函数如果它使用 match.call 会更好,因为它目前在 OP 的函数中失败,但如果它有 Josh 的实现而不是 sys.call 则不会。然后顺便说一句,OP 的问题可以通过简单地调用alist 而不是list 来解决。
    猜你喜欢
    • 2022-06-13
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2015-04-11
    相关资源
    最近更新 更多