如何使用source()限制函数的范围?
我来自python,在python中,import以更具名称空间的方式运行,我对R几乎没有什么背景知识 我正在尝试开发一个R应用程序,该应用程序被拆分为不同的实体,但据我所知,R没有python中的导入功能。从我收集的信息来看:如何使用source()限制函数的范围?,r,R,我来自python,在python中,import以更具名称空间的方式运行,我对R几乎没有什么背景知识 我正在尝试开发一个R应用程序,该应用程序被拆分为不同的实体,但据我所知,R没有python中的导入功能。从我收集的信息来看: 库是导入已安装的库,这些库有自己的名称空间,因此导入.R时发生冲突的风险可以通过include.only来降低 如果您的代码是应用程序的一部分,而不在外部库中,则必须使用源代码。从我收集的资料来看,source基本上相当于将sourceed.R文件的全部内容插入sou
- 库是导入已安装的库,这些库有自己的名称空间,因此导入.R时发生冲突的风险可以通过
来降低include.only
- 如果您的代码是应用程序的一部分,而不在外部库中,则必须使用源代码。从我收集的资料来看,source基本上相当于将sourceed.R文件的全部内容插入sourceing.R文件
import*
以下是问题:
x:
源脚本中创建的对象将在源脚本所在的环境中可用。因此,如果脚本源于全局环境,则源脚本中创建的对象将在全局环境中可用
如果你源代码两次,它就会被包含一次。就像你运行x一样,你可以在一个环境中源代码。请参阅source
的local
参数。另请参阅CRAN上的modules包。@G.Grothendieck我不太清楚local在这个上下文中的含义。源.R文件有自己的sep吗如果是这样的话,请尝试cat("a@G.Grothendieck经过实验后,它不会将其绑定到其他环境。仅当您从函数内部(例如)进行寻源时,local才有效。如果您不包括local,source在任何情况下都会将符号绑定到全局环境。仅当您包括local=TRUE时,符号才会绑定到函数的环境。您是否尝试过我的示例??您可以将源代码导入到环境中。请参阅source
的local
参数。还可以查看CRAN.@G.Grothendieck上的模块包。我不太清楚在这种情况下,local的含义。在这种情况下,源代码.R文件是否有自己的独立环境?是的。请尝试cat("a@G.Grothendieck经过实验后,它不会将其绑定到其他环境。仅当您从函数内部(例如)进行寻源时,local才有效。如果您不包括local,source在任何情况下都会将符号绑定到全局环境。仅当您包括local=TRUE时,符号才会绑定到函数的环境。您是否尝试过我的示例??>“如果您两次源代码,它将被包含一次”。这不是从我的简短评估中得出的。如果您有一个cat()或print(),您将收到两条消息,这意味着每次您需要使用另一个.R文件中的内容时,您必须依赖给定的代码已经源代码,因此存在于全局命名空间中(糟糕!)或者在任何地方都可以找到它,并且像C@StefanoBorini一样有一个双重包含保护。我同意print()
或cat()
。但我相信后面的任何分配(函数或其他对象)只会覆盖同名的现有对象吗?是的,但我的观点是,如果它的行为如此,您可能会遇到以下问题:1.具有循环依赖关系的代码将永远导入自身,直到内存耗尽2.会多次产生副作用3.如果两个模块现在恰好具有相同的命名例程o导入顺序问题,这在大型应用程序中是一个噩梦我想我找到了一个简单的解决方案。请查看上面更新的示例。source(“second.R”,local=new.env())
创建了一个新的环境来运行源代码。现在我们在运行second.R
的环境中看到a
等于2
(因为cat()
为我们打印了这个,但我们也看到,
a`在父环境中是不变的(即,它仍然等于1)>“如果你两次源代码,它会被包含一次”。这不是我的简单评估。如果你有一个cat()或print()),您会收到两条消息,这意味着每当您需要使用另一个.R文件中的内容时,您必须依赖给定的代码已经过源,因此存在于全局名称空间中(糟糕!),或者在任何地方都进行源代码,并像C中一样使用双重包含保护。@StefanoBorini我同意print()
或cat()
。但我相信后面的任何赋值(函数或其他对象)只会覆盖同名的现有对象吗?是的,但我的观点是,如果它的行为如此,您可能会遇到以下问题:1.具有循环依赖关系的代码将永远导入自身,直到内存耗尽2.会多次产生副作用3.如果发生两个模块
cat("hello")
source("whatever.R")
source("whatever.R", local=whatever <- new.env())
x()
whatever$x()
cat("whatever")
print(environment())
x <- function() {
print("x")
}