为什么 R 的 attribute() 函数在使用显式参数时会失败?

问题描述 投票:0回答:1

我正在与

RODBC
parallel
合作,针对某些内部报告的数据系统进行多次查询。为了便于建立新连接,我将从
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 源代码 - 我对此不太熟悉。

为什么使用显式参数 (

attributes()
) 时
obj =
会失败,但不使用时却运行良好? (RStudio 关于建议
obj =
的行为是否应该改变?)

r attributes
1个回答
5
投票

这似乎是属性文档中的一个错误。该参数可能应该命名为

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=”)。

© www.soinside.com 2019 - 2024. All rights reserved.