R 使用安全吗;";作为数据帧的名称?

R 使用安全吗;";作为数据帧的名称?,r,pandas,R,Pandas,一个常见的习惯用法(可以在书籍、教程和许多堆栈溢出问题中找到)是使用df作为数据帧的一种一次性标识符。我已经这样做了数百次,似乎没有任何不良影响,但后来遇到了以下代码: library(tree) df <- droplevels(iris[1:100,c(1,2,5)]) tr <- tree(Species ~ ., data = df) plot(tr) text(tr) partition.tree(tr) 我通过反复试验发现,如果我简单地用df2替换上面的df,代码就可以

一个常见的习惯用法(可以在书籍、教程和许多堆栈溢出问题中找到)是使用
df
作为数据帧的一种一次性标识符。我已经这样做了数百次,似乎没有任何不良影响,但后来遇到了以下代码:

library(tree)
df <- droplevels(iris[1:100,c(1,2,5)])
tr <- tree(Species ~ ., data = df)
plot(tr)
text(tr)
partition.tree(tr)
我通过反复试验发现,如果我简单地用
df2
替换上面的
df
,代码就可以正常工作。确实,
df
是F分布的密度函数的名称,但这似乎与此处无关。这是
包中的一个bug,还是一个重要的警示故事,其寓意是我应该避免使用
df
作为数据帧的名称,因为这样做会导致名称冲突

这是树包中的一个bug,还是一个重要的警示故事,其寓意是我应该避免使用df作为数据帧的名称,因为这样做会导致名称冲突

我认为在这种情况下,两者都有可能,但出于你们的目的,我更愿意把它作为一个警示性的例子。它在这里导致错误的事实表明,它可能不是最佳实践

根据我的经验,R不能很好地管理名称空间(例如,与Python相比)。因此,tree的作者(有意或无意地)引入与
df
(数据帧的常用一次性名称)的冲突可能是不明智的,如果事实上他们这样做了(请参见此处和问题中的注释;不清楚这是data.frame名称的冲突还是eval()的不当使用)导致data.frame对象和函数之间发生冲突)


话虽如此,这是一个很好的例子,说明了名称空间的重要性,并(IMO)提出了如何编写更好的R代码。我认为名称空间正被引入到R生态系统中,但我在R方面的经验是,存在大量名称空间“扁平化”和大量名称冲突的机会。出于这个原因,我建议您将此作为为自己的变量使用更具描述性/唯一性标识符的原因。这避免了类似您遇到的冲突,并提供了一些将来的证明,以帮助避免在包内部发生更改时冲突蔓延到以前的工作代码中。

由于潜在的名称冲突会使错误更难调试,我强迫自己长时间使用
dtf
而不是
df
。然而,tidyverse中重要的软件包集合似乎可以在测试中的任何地方使用
df
,例如:

df%分组依据(g)
我最近经常使用
df
来命名python数据帧。因此,我现在也倾向于在R中使用
df
。让我们看看这会不会反过来

平面命名空间或嵌套命名空间 名称空间问题不是原始问题的一部分,但它与
df
的名称冲突问题有关。在探索性数据分析中使用平面名称空间更容易、更有趣,您只需直接调用所有函数,但它可能会导致冲突。嵌套的命名空间使调试更加可靠,但代价是有点麻烦,因为您必须在每个函数调用之前加上包名

名称空间冲突在python中不是什么问题,因为它有一个更嵌套的名称空间。例如,您
将numpy导入为np
,并使用
np
作为所有numpy函数调用的前缀,例如
np.array()
。(可以从numpy import*执行
,但通常会对此进行投诉)


在R中,您必须将探索性数据分析中使用的垃圾代码与要重用的更持久的代码区分开来。在第二种情况下,如果您只使用另一个包中的一个或几个函数,最好不要导入包
库(包名称)
,而是使用
package\u name::function

调用您真正需要的函数,大多数人确实避免了对象命名与常见函数的冲突,是的,但实际问题在我的经验中是非常罕见的。我没有得到那个错误,但我得到了
partition.tree(tr)
then“error in terms.formula(formula,data=data):'data'参数的类型是错误的”。我怀疑您加载了一个包,它的
droplevels
函数屏蔽了pkg:base中
droplevels
的行为。在这种情况下,这是因为
eval()
tree::model.frame.tree
的深层环境下运行。在这种情况下,我认为它是<代码>树>代码>包中的一个bug。但一般来说,请避免使用标准函数名。@MrFlick:这样您就可以向包作者解释这个错误了。(我不知道这是否是我得到的错误的原因?)请报告。@42-事实上,我刚刚意识到我得到的错误与你的相同,与OP不同。使用
tree_1.0-37
r3.4.1
测试,我不认为tree的作者“引入了与
df
的冲突”。关于这个问题的评论表明,他们使用
eval
的方式不好,这可能会导致与任何函数共享名称的用户命名数据帧出错。从MrFlick的评论来看,eval()的不当使用似乎是另一个问题的原因,而不是OP暴露的问题,尽管我同意你的观点。我将编辑声明,这可能是树中暴露此问题的更微妙和特定的错误,但我认为我关于名称空间和使用唯一标识符的观点是站得住脚的。是的,我同意你的大部分答案。我的观点很简单,不是包作者在使用
df
,而是OP。当你说“树的作者(有意或无意)引入与
df
的冲突可能是不明智的”时,听起来好像包作者使用了
df
,当他们似乎根本没有使用
df
时。是艾尔
Error in as.data.frame.default(data, optional = TRUE) : 
  cannot coerce class ""function"" to a data.frame
  df <- tibble(g = 1:3, x = 3:1) %>% group_by(g)