使用显式参数时,为什么R的attributes()函数失败?

TAR*_*man 4 attributes r rstudio

我正在使用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"
Run Code Online (Sandbox Code Playgroud)

应该注意的是,obj =行为是RStudio建议的一个标签.但是,它会导致错误.我试着查看源代码attributes,但它是一个原始的,所以我不得不深入研究C源代码 - 我对此并不熟悉.

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

MrF*_*ick 5

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

attributes(x = example.data)
Run Code Online (Sandbox Code Playgroud)

问题是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
Run Code Online (Sandbox Code Playgroud)

但是还有其他原语使用除x以下名称之外的名称:例如seq_along(使用"along.with =")和quote(使用"expr =").