【问题标题】: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() 的参数之一?

【问题讨论】:

标签: r function arguments


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2015-08-21
  • 2021-09-30
  • 2017-08-11
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多