【问题标题】:Why are the default namespace behaviors for loaded packages in R and Python different? [closed]为什么 R 和 Python 中加载的包的默认命名空间行为不同? [关闭]
【发布时间】:2017-06-10 07:25:48
【问题描述】:

在 Python 中,使用默认行为,如果您想使用来自已加载包 package 的函数 fun,则在调用它时始终必须将其指定为属于某个新的/不同的命名空间,即 package.fun()。如果您已安装但未加载包,则根本无法调用该函数(据我所知)。

在 R 中,使用默认行为,如果您想使用已加载包 package 中的函数 fun,您可以毫无问题地使用全局命名空间,即 fun() 调用 fun。如果包已安装但未加载,您可以仍然通过指定一个新的/不同的命名空间来调用它,即package::fun()

问题:如果从已安装包管理命名空间的一种方式比另一种更好,那么为什么两种编程语言不使用相同的默认行为?

我读过很多人说默认 Python 命名空间行为很棒,但我从未见过使用 R 的人觉得有必要捍卫 R 的默认行为,即使它与默认行为有很大不同Python,应该很棒。

也许不同之处在于没有 CRAN 的 Python 版本?作为一个初学者,我真的不明白这有什么关系,但至少 CRAN 确实与包有关。虽然我认为并非 Bioconductor 上的所有 R 包都在 CRAN 上可用。

示例:作为更具体的示例:在 Python 中

import numpy
numpy.array()

有效,但都没有

import numpy
array()

也没有

numpy.array()

有效。

在 R 中,两者都

library(ggplot2) ggplot()

ggplot2::ggplot()

工作。

【问题讨论】:

  • 如果你这样做 - from numpy import *
  • 我不知道 python 是如何工作的,但据我所知(我很乐意得到纠正)库并没有真正从包中加载所有内容。元素在您需要时加载。如果您不调用库并调用 :: 表示法,我想这些数据将在操作结束时被清除。另外,你能在 python 中处理 maggritr 类型的运算符吗?对于其余部分,我认为这是一致性、可读性和易用性之间的权衡。
  • 为什么要专门比较 python 和 R?每种语言都有自己处理扩展/模块/库/任何东西的方式,因此不同语言在这件事上表现不同也就不足为奇了。
  • @nicola Python 和 R 应该是“顶级数据科学语言”。因此,我在学习 R 的同时尝试重新熟悉 Python,以便能够同时使用这两种语言。我同意这并不奇怪,我想我感到惊讶的是为什么没有人抱怨或捍卫 R 的行为,考虑到 Python 的行为受到了多少赞扬。既然 Python 的行为对数据科学如此有利,那么为什么将 R 用于数据科学的人们会忍受与 R 完全相反的行为呢?
  • python 和 R 都不是为“数据科学”而构思和开发的,因为当时甚至不存在数据科学。它们现在(也)用于相同目的的事实完全无关紧要。关于人们的抱怨或赞美,我什么也说不出来;只是问他们为什么。对于语言加载库的方式,我个人看不出太多可抱怨或称赞的地方。我只是学习如何做到这一点。

标签: python r namespaces


【解决方案1】:

不同语言的行为不同,并且所有语言都没有“最佳”行为,因为上下文(一致性、传统、最小意外原则)很重要。 Python 只是与它的哲学(和实际事实)保持一致,即一切都是对象。模块是一个对象。如果要访问对象的属性,请使用点表示法。如果找不到对象(在您的第三个numpy 示例中,您没有找到import numpy),您会得到一个NameError,这也是您对一致行为的期望。

【讨论】:

  • 啊,我不知道包(=模块?)也是 Python 中的对象。这在R中不一样吗?所以行为是不同的,因为 Python 比 R 更“基于对象/居中”?
  • @Chill2Macht 为例。打开解释器并输入imort numpy; numpy - 它会说它是一个模块对象。我对 R 了解不多,但显然它只是设计不同。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2012-12-05
  • 2014-08-10
  • 2013-06-04
  • 1970-01-01
相关资源
最近更新 更多