Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用source()限制函数的范围?_R - Fatal编程技术网

如何使用source()限制函数的范围?

如何使用source()限制函数的范围?,r,R,我来自python,在python中,import以更具名称空间的方式运行,我对R几乎没有什么背景知识 我正在尝试开发一个R应用程序,该应用程序被拆分为不同的实体,但据我所知,R没有python中的导入功能。从我收集的信息来看: 库是导入已安装的库,这些库有自己的名称空间,因此导入.R时发生冲突的风险可以通过include.only来降低 如果您的代码是应用程序的一部分,而不在外部库中,则必须使用源代码。从我收集的资料来看,source基本上相当于将sourceed.R文件的全部内容插入sou

我来自python,在python中,import以更具名称空间的方式运行,我对R几乎没有什么背景知识

我正在尝试开发一个R应用程序,该应用程序被拆分为不同的实体,但据我所知,R没有python中的导入功能。从我收集的信息来看:

  • 库是导入已安装的库,这些库有自己的名称空间,因此导入.R时发生冲突的风险可以通过
    include.only
    来降低
  • 如果您的代码是应用程序的一部分,而不在外部库中,则必须使用源代码。从我收集的资料来看,source基本上相当于将sourceed.R文件的全部内容插入sourceing.R文件
我在这里讨论第二个案例。不是第一次。我怀疑在这种情况下,如果您有多个具有相同符号的source.R,它们将无声地冲突。从python的角度来看,它非常类似于
import*

以下是问题:

  • 我说sourceed.R中定义的函数都将在全局环境中运行,而不是在它们自己的环境中运行,对吗
  • 如果你找了两次东西怎么办?包括两次吗
  • 是否有技术或最佳实践解决方案来防止来自恰好具有相同符号名称的源模块的意外冲突
  • 编辑

    这是G.Grothendieck建议之后的一个例子:

    ex1.R

    猫(“你好”) 来源(“whatever.R”) 来源(“whater.R”,local=whater,回答您的问题:

  • 源脚本中创建的对象将在源脚本所在的环境中可用。因此,如果脚本源于全局环境,则源脚本中创建的对象将在全局环境中可用
  • 如果你两次源代码,它会被包含一次。就像你对你的问题运行
    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")
    }