gpt4 book ai didi

r - 将脚本与 .GlobalEnv : Source script that source scripts 分开

转载 作者:行者123 更新时间:2023-12-04 13:06:21 29 4
gpt4 key购买 nike

这个问题类似于Source script to separate environment in R, not the global environment , 但有一个关键的转折。

考虑一个源另一个脚本的脚本:

# main.R
source("funs.R")
x <- 1
# funs.R
hello <- function() {message("Hi")}

我想获取脚本 main.R并将所有内容保存在“本地”环境中,比如 env <- new.env() .通常,可以调用 source("main.R", local = env)并期望所有内容都在 env 中环境。但是,这里不是这种情况: xenv 的一部分, 但是函数 hello不是!它在 .GlobalEnv .

问题:即使该脚本本身源自其他脚本,并且不修改正在获取的其他脚本,我如何才能将脚本源到 R 中的单独环境?

感谢您的帮助,如果我能澄清任何问题,请告诉我。

编辑 1:更新问题以明确说明作为源的脚本不能被修改(假设它们不受您的控制)。

最佳答案

您可以使用trace 将代码注入(inject)到函数中,因此您可以强制所有 source 调用设置 local = TRUE。如果 localFALSE,我在这里只是覆盖它,以防任何对 source 的嵌套调用由于它们自己的特殊逻辑而实际将其设置为其他环境.

env <- new.env()

# use !isTRUE if you want to support older R versions (<3.5.0)
tracer <- quote(
if (isFALSE(local)) {
local <- TRUE
}
)

trace(source, tracer, print = FALSE, where = .GlobalEnv)

# if you're doing this inside a function, uncomment the next line
#on.exit(untrace(source, where = .GlobalEnv))

source("main.R", local = env)

如代码中所述,如果你把这个逻辑包装在一个函数中,考虑使用 on.exit 来确保即使出现错误也能untrace

编辑:如评论中所述,如果您要加载的某些脚本假设有 1 个(全局)环境,一切都结束了,这可能会出现问题。我想你可以把示踪剂改成类似的东西

tracer <- quote(
if (missing(local)) {
local <- TRUE
}
)

或者也许

tracer <- quote(
if (isFALSE(local)) {
# fetch the specific environment you created
local <- get("env", .GlobalEnv)
}
)

前者假定如果脚本根本没有指定 local,它不关心哪个环境最终容纳了一切。后者假定未指定 local 或将其设置为 FALSEsource 调用希望一切都在 1 环境中结束,并修改逻辑以使用您的环境而不是全局环境。

关于r - 将脚本与 .GlobalEnv : Source script that source scripts 分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69300358/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com