为啥函数 c() 接受未记录的参数?

Posted

技术标签:

【中文标题】为啥函数 c() 接受未记录的参数?【英文标题】:Why does function c() accept an undocumented argument?为什么函数 c() 接受未记录的参数? 【发布时间】:2014-09-09 00:50:25 【问题描述】:

基本函数 c() 的文档将其默认参数显示为

c(..., recursive = FALSE)

现在,如果我们定义

lst <- list(x = 1:5, y = 6:10)

然后将列表与

结合起来
c(lst, recursive = TRUE)
# x1 x2 x3 x4 x5 y1 y2 y3 y4 y5 
#  1  2  3  4  5  6  7  8  9 10 

列表被折叠,名称被保留。

但我们也可以使用另一个未记录的参数use.names 来删除名称。

c(lst, recursive = TRUE, use.names = FALSE)
# [1]  1  2  3  4  5  6  7  8  9 10

为什么不 use.names 记录为 c() 的参数之一?

【问题讨论】:

只是为了结束这个循环,c() 中的use.names= 记录在 R 3.3.2 (cran.r-project.org/doc/manuals/r-devel/NEWS.html) 中。 r.789695.n4.nabble.com/… 有一个关于此的主题 【参考方案1】:

我认为这是由于recursive=TRUE 我认为它必须使用与unlist 相同的代码。 use.names 参数在?unlist 中进行了描述。

【讨论】:

他们似乎在源代码中有non-overlapping code paths。 我看到了。我想知道这是不是偶然的包含? c( ..., recursive=TRUE) 的行为似乎模仿了我通常使用unlist 来完成的操作。 里普利教授曾说过 c() 和 unlist() '共享代码':markmail.org/search/… @BondedDust -- 不错的收获! Here, from July 30, 1998,将do_c 拆分为do_cdo_unlist 该代码以前是共享的,但已(经过很长时间)分开。发生这种情况时,use.names 参数显然已保留,但未记录在案。【参考方案2】:

c 是一个 S4 通用函数,这意味着根据其参数调用不同的函数。

并非所有这些函数都采用参数use.names,因此将其记录在c() 的文档中是没有意义的。

【讨论】:

在default function do_c_dflt 中很奇怪,但它不像“递归”那样的文档。它们在源代码中没有区别对待。 我不相信那个解释(或者至少我不会在没有更多支持证据的情况下!)原因如下:(1) c() 既是 S3 函数,也是 S4 函数功能;在新的 R 会话中比较 methods("c")showMethods("c") 的结果。 (2) 与use.names= 相比,c() 方法对recursive= 的支持并不普遍; recursive=c.numeric_version() 中做了什么? (3) S4 泛型通常只有几个参数,它们似乎通常都有文档记录;为什么这里有例外,use.names 是传递给底层 C 函数的三个形式参数之一? c 是原始函数,不是 S4! @lebatsnok,如果您查看?c 的输出,它会显示This is a primitive function,但它还会进一步显示This function is S4 generic @merlin - 我认为帮助页面在这里令人困惑。您可以使用setMethodc 定义S4 方法(我试过,它有效),但您也可以定义S3 方法。当您以普通方式定义 S4 泛型并调用它时,例如,foo 那么isS4(foo) 将为 TRUE。不适用于c

以上是关于为啥函数 c() 接受未记录的参数?的主要内容,如果未能解决你的问题,请参考以下文章

C 函数中未指定数量的参数 - void foo()

为啥复制构造函数应该在 C++ 中通过引用来接受它的参数?

如果标准 golang big.Int 函数接受两个参数并返回一个值,为啥它会使用接收器?

收到“未定义无参数构造函数”错误,不知道为啥

为啥在尝试读取记录集字段时未定义访问 vba 抛出子或函数?

何时使用缺失值与 NULL 值在 R 中传递未定义的函数参数,为啥?