【发布时间】:2019-08-08 12:44:46
【问题描述】:
我来自 python,其中 import 以更命名空间的风格表现,我对 R 的背景很少。
我正在尝试开发一个拆分为单独实体的 R 应用程序,但据我了解,R 没有像 python 中的导入。从我收集到的:
- library 用于导入已安装的库,这些库具有自己的命名空间,因此可以使用
include.only降低导入 .R 时发生冲突的风险。 - 如果您的代码是应用程序的一部分,而不是在外部库中,则必须使用源代码。从我收集到的信息来看,source 基本上相当于将 sourced.R 文件的全部内容放入 sourcing.R 文件中。
我在这里讨论第二种情况。不是第一个。我怀疑在这种情况下发生的情况是,如果您有多个具有相同符号的 sourced.R,它们将默默地发生冲突。从python的角度来看,它很像import *。
以下是问题:
- 我是否正确地说在 sourced.R 中定义的函数都将进入全局环境,而不是它们自己的环境?
- 如果您对某项进行两次采购会怎样?是否包含两次?
- 是否有技术或最佳实践解决方案来防止来自恰好具有相同符号名称的源模块的意外冲突?
编辑
这是 G. Grothendieck 建议后的示例:
ex1.R
cat("hello")
source("whatever.R")
source("whatever.R", local=whatever <- new.env())
x()
whatever$x()
cat("whatever")
print(environment())
x <- function() {
print("x")
}
因此,原则上,可以使用这种策略来确保函数不会全部被推到全局命名空间中并发生冲突。但是,它变成了导入代码的责任,另外,如果维护了任何状态并且两段代码来自同一个模块,它们最终会得到不同的环境,从而导致不同的状态。
底线是环境必须是无状态的。
【问题讨论】:
-
您可以在环境中获取资源。请参阅
source的local参数。另请参阅 CRAN 上的模块包。 -
@G.Grothendieck 在这种情况下,我不太清楚本地的含义。在这种情况下,sourced.R 文件是否有自己独立的环境?
-
是的。试试
cat("a <- 3", file = "testa.R"); source("testa.R", local = e <- new.env()); ls(e) -
@G.Grothendieck 经过实验,它不会将其绑定到不同的环境。本地仅在您从例如采购时才有效。在一个函数里面。如果您不包括本地,则无论如何 source 都会将符号绑定到全局环境。仅当您包含 local=TRUE 时,符号才会绑定到函数的环境
-
你试过我的例子了吗????
标签: r