我来自python,其中import表现为更命名空间的样式,并且我对R的了解很少。
我正在尝试开发一个R应用程序,该应用程序分为多个单独的实体,但是据我了解,R没有像python一样重要。根据我的收集:
include.only
减轻导入.R中发生冲突的风险。我在这里讨论第二种情况。不是第一个。我怀疑在这种情况下会发生的情况是,如果您有多个具有相同符号的source.R,它们将默默冲突。从python的角度来看,它非常类似于import *
。
以下是问题:
修改
这是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")
}
因此,原则上,可以使用这种策略来确保函数不会在全局名称空间和冲突中全都被推入。但是,这是导入代码的责任,此外,如果维持任何状态并且两个代码源于同一模块,则它们最终将处于不同的环境中,因此状态也将不同。
最重要的是环境必须是无状态的。
答案 0 :(得分:0)
对您的问题:
sourced
所在的环境中可用。因此,如果脚本是从全局环境中获取的,那么在源脚本中创建的对象将在全局环境中可用x <- 4; x <- 4
。在这种情况下,x
将只包含一次local
参数。您可能还会发现this答案很有用(根据需要显示全局分配的工作原理)。 Hadley's write up on environments很全面。如果有用,我们可以创建以下2个文件。仅运行first.R
中的代码即可向我们显示
a
变成2
,这表明源脚本中的赋值确实会覆盖其源环境中的任何名称(这同样适用于对象/函数)c
等于8
,这确认源脚本从源的环境中“看到”对象b
# first.R
# rm(list=ls())
a <- 1
b <- 4
source("second.R", local = new.env())
# second.R
a <- 2
new_func <- function(x) { x * 2 }
c <- new_func(b)
print(a)
print(c)