【问题标题】:Why does R's attributes() function fail when using explicit arguments?为什么使用显式参数时 R 的 attributes() 函数会失败?
【发布时间】:2016-02-11 16:56:18
【问题描述】:

我正在与RODBCparallel 合作,针对某些内部报告对数据系统进行多次查询。为了便于建立新的连接,我将从RODBC 对象中提取连接字符串。为此,我计划使用attributes()。但是,我遇到了我不理解的行为。下面是一个最小的工作示例:

> example.data <- data.frame(letters = sample(x = LETTERS,size = 20,replace = T),
+                            numbers = sample(x = 0:9,size = 20,replace = T))
> 
> attributes(obj = example.data)
Error in attributes(obj = example.data) : 
  supplied argument name 'obj' does not match 'x'
> attributes(example.data)
$names
[1] "letters" "numbers"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

$class
[1] "data.frame"

应该注意obj = 行为是 RStudio 建议的一种选项卡。但是,它会导致错误。我试图查看attributes 的源代码,但它是一个原始代码,所以我必须深入研究 C 源代码——我对此并不熟悉。

为什么在使用显式参数 (obj =) 时 attributes() 会失败,但在不使用时运行良好? (并且 RStudio 关于建议 obj = 的行为是否应该改变?)

【问题讨论】:

  • 很好的发现。有趣的是,它确实适用于 attributes(x = ...),所以似乎 R Core 的某个人可能忘记了更改某些内容。但通常无论如何都不会使用obj =,因为这是attributes()的唯一参数
  • 不确定我们应该在页面上的哪个位置查看,但这里是attrib.c。我认为是do_attributes,但我不确定。我们需要一个叫约书亚的人。
  • 嗯,由于某种原因,它通过Rf_check1arg检查参数是否称为“x”

标签: r attributes rstudio


【解决方案1】:

这似乎是属性文档中的一个错误。该参数可能应该命名为x。你可以这样称呼它

attributes(x = example.data)

问题在于attributes() 是一个原始函数,原始函数的行为与R 中的常规函数​​不同。它们没有形参(formals(attributes) 返回NULL)。对于这些类型的函数,R 通常不会按名称解析参数,并且出于效率原因会假定它们处于特定的位置顺序。这就是为什么最好不要命名它们,因为您无法更改这些参数的顺序。这里应该不用给参数命名了。

还有其他函数在文档中的参数名称与代码检查的值之间存在不匹配。例如

isS4(pi)
# [1] FALSE
# documented parameter name is "object"
isS4(object=pi)
# Error in isS4(object = pi) : 
#   supplied argument name 'object' does not match 'x'
isS4(x=pi)
# [1] FALSE

但也有其他原语使用 x 以外的名称:例如seq_along(使用“along.with=”)和quote(使用“expr=")。

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多