当我尝试在R中使用str
函数时出现错误。
这是数据:
> dput(data1)
data1<- structure(list(Year = 1990:2010, Counts = c(1401L, 1290L, 1168L,1260L, 1252L, 1381L, 1330L, 1275L, 1235L, 1248L, 1237L, 1206L, 1175L, 1172L, 1055L, 1030L, 1002L, 987L, 915L, 806L, 868L)), .Names = c("Year", "Counts"), class = "data.frame", row.names = c(NA, -21L))
我不知道为什么R使用str
向我发出以下错误,而class
函数明确表示data1是data.frame
。
> class(data1)
[1] "data.frame"
> str(data1)
Error in str(data1) :
unable to find a non-generic version of function "str"
我正在使用适用于Windows的R版本2.15.0(2012-03-30)。
任何帮助将不胜感激。
修改 有了干净的R会话,它起作用了。但为什么会出现这种问题呢?有可能知道这个吗?
答案 0 :(得分:4)
好的,我会咬人。
为什么会出现这种问题?
对象(即函数,变量)掩码是R代码中最常见的错误或错误源之一。为什么会发生这种情况?
嗯,位于?Reserved
的R解析器中有一个保留字列表:
R解析器中的保留字是:
if
else
repeat
while
function
for
in
next
break
TRUE
FALSE
NULL
Inf
NaN
NA
NA_integer_
NA_real_
NA_complex_
NA_character_
...
和..1
,..2
等,用于引用传递的参数 来自封闭的功能。
这意味着您(用户)无法重新分配这些名称的值。但几乎任何其他东西(假设它的语法有效)都在界限内。
例如,data
实际上是 utils 包中的一个函数,这就是人们通常建议不要命名数据框data
的原因。您将屏蔽函数 data
,任何依赖它的代码都会被阻塞。
老实说,我通常使用df
作为数据框,即使这是一个计算F分布的分布函数的函数。 (我不需要F分配函数。但我仍然不应该这样做。)
这个问题的一个特别狡猾的例子是R用户关于设置的常见笑话:
T <- FALSE
F <- TRUE
很多人都很懒惰,并且对T
和F
使用TRUE
和FALSE
,现在我们确切地知道为什么这是真的,真的他们的主意很糟糕。 (很可能有人会为T
或F
分配一些其他价值。)
事实上,无论何时加载软件包,您都可能会看到一堆警告,其中R告诉您通过加载该软件包,您只是掩盖了一堆函数,因为它们具有通用名称。
我怎么知道发生了这种情况?
这更容易。正如Ben在评论中所说,你使用conflicts()
确定了这种事情。