gpt4 book ai didi

r - 如何在不覆盖当前变量的情况下获取 R 代码?

转载 作者:行者123 更新时间:2023-12-04 13:59:38 25 4
gpt4 key购买 nike

我试图通过使用 source 执行 R 代码来检索结果命令。因为存在一些同名的变量,所以执行的R文件中的变量会覆盖当前变量。如何在不覆盖当前变量的情况下检索结果?

#main.R Code
b=0
source('sub.R')
if(a>1){print(T)}else{print(F)}

#sub.R
b=1
test<-function(x){x=1}
a=test(b)

我只想检索 a来自 sub.R没有 bmain.Rsub.R 中的同名变量覆盖.本质上,我想执行一个 R 文件,就像调用一个只保留返回值的方法一样。

最佳答案

您可以使用 sys.source 将内容来源到特定环境中。如果你喜欢。例如

b <- 0
ee <- new.env()
sys.source('sub.R', ee)
ee$a
# [1] 1 # the ee envir has the result of the sourcing
if(ee$a>1) {print(T)} else{print(F)}
# [1] FALSE
b
# [1] 0 #still zero

但是,如果您希望源文件就像函数一样,您应该只在源文件中包含一个函数,然后在主文件中调用该函数。不要试图在环境中传递值。例如
# sub.R  --------------
runsub<-function() {
b=1
test<-function(x){x=1}
a=test(b)
a
}

# main.R -------------
b <- 0
source('sub.R')
a <- runsub()
if(a>1){print(T)}else{print(F)}

或者,如果您想编写一个辅助函数来从源环境返回特定值,您可以这样做
sourceandgetvar <- function(filename, varname) {
ee <- new.env()
sys.source(filename, ee)
stopifnot(varname %in% ls(envir=ee))
ee[[varname]]
}

然后你可以将 main.R 更改为
b <- 0
a <- sourceandgetvar("sub.R", "a")
if(a>1) {print(T)} else {print(F)}
# [1] FALSE
b
# [1] 0

关于r - 如何在不覆盖当前变量的情况下获取 R 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28634638/

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