我试图通过使用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)
Run Code Online (Sandbox Code Playgroud)
我只想取回a从sub.R没有b在main.R由同名变量被覆盖sub.R.本质上,我想执行一个R文件,就像调用一个只保留返回值的方法一样.
MrF*_*ick 10
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
Run Code Online (Sandbox Code Playgroud)
但是如果您希望将源文件视为函数,则应该在源文件中包含一个函数,然后在主文件中调用该函数.不要试图在环境中传递值.例如
# 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)}
Run Code Online (Sandbox Code Playgroud)
或者,如果要编写辅助函数以从源环境返回特定值,则可以执行此操作
sourceandgetvar <- function(filename, varname) {
ee <- new.env()
sys.source(filename, ee)
stopifnot(varname %in% ls(envir=ee))
ee[[varname]]
}
Run Code Online (Sandbox Code Playgroud)
然后你可以将main.R改为
b <- 0
a <- sourceandgetvar("sub.R", "a")
if(a>1) {print(T)} else {print(F)}
# [1] FALSE
b
# [1] 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |