为啥函数 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_c
和do_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 - 我认为帮助页面在这里令人困惑。您可以使用setMethod
为c
定义S4 方法(我试过,它有效),但您也可以定义S3 方法。当您以普通方式定义 S4 泛型并调用它时,例如,foo
那么isS4(foo)
将为 TRUE。不适用于c
。以上是关于为啥函数 c() 接受未记录的参数?的主要内容,如果未能解决你的问题,请参考以下文章
如果标准 golang big.Int 函数接受两个参数并返回一个值,为啥它会使用接收器?