Source script to separate environment in R, not the global environment

后端 未结 5 1855
闹比i
闹比i 2020-12-08 22:24

Is there a way to source() a script in R such that it is attached as a parent to the global environment (.GlobalEnv)?

Curr

5条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-08 22:56

    The simplest way to source a script as if it was a package (i.e. such that lexical scoping won't result in the use of variables defined in the global environment when calling functions defined in your R script) is to create an environment that that is whose parent is the .BaseNamespaceEnv, and then call source() using that environment.

    For example if you have a script like this:

    # << my-script.R >>
    my_fun <- function(x){x + y}
    

    Then evaluating the following at the console, won't generate an error, as it would if my_fun were defined within it's own package:

    source("my-script.R")
    y = 2
    my_fun(1)
    #> 3
    

    However, if you create an environment whose search() path does not include the Global Environment (.GlobalEnv) then you'll get a proper error when you call the function from your script:

    # Create the environment:
    ENV = new.env(parent = .BaseNamespaceEnv)
    # Attache it to the search path so that objects in your environment can be
    # found from the global environment (i.e. from the console):
    attach(ENV)
    # do things:
    source("my-script.R",ENV)
    y = 2
    my_fun(1)
    #> Error in .ENV$my_fun(3) : object 'y' not found
    

提交回复
热议问题