在函数中获取.R脚本并传递变量(RODBC)

Ray*_*Ray 12 r

在我正在研究的事情上,我遇到了一些打嗝.假设我有以下简单示例.让...

v <- c(606:608) ## Some vector of integers
Run Code Online (Sandbox Code Playgroud)

我也有一个单独的脚本(让我们只是调用它foo.R)有类似的东西(使用RODBC包):

um <- sqlQuery(artemis,paste("select * from port.tdtf_VaR_Unmatched (",LatestModelRun,")",sep=""))
Run Code Online (Sandbox Code Playgroud)

现在假设我想运行以下循环函数:

test <- function() {
 for (i in 1:length(v)) {
  LatestModelRun <- v[i]
  source("C:/R/foo.r")
  print(unmatched)} }

test() ## Run it
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我收到以下错误: Error in paste("\n\tselect * from port.tdtf_VaR_Unmatched (", LatestModelRun, : object 'LatestModelRun' not found

所以,不知何故,它不是在函数中LatestModelRun定义的变量中读取test.

这是traceback():

7: paste("\n\tselect * from port.tdtf_VaR_Unmatched (", LatestModelRun, 
   ")\n\twhere [PortfolioProduct] not in ('REC - Generic','REC - Green-e NY')\n\torder by [PortfolioProduct], [Year]", 
   sep = "")
6: odbcQuery(channel, query, rows_at_time)
5: sqlQuery(artemis, paste("\n\tselect * from port.tdtf_VaR_Unmatched (", 
   LatestModelRun, ")\n\twhere [PortfolioProduct] not in ('REC - Generic','REC - Green-e NY')\n\torder by [PortfolioProduct], [Year]", 
   sep = ""))
4: eval.with.vis(expr, envir, enclos)
3: eval.with.vis(ei, envir)
2: source("C:/R/foo.r")
1: test()
Run Code Online (Sandbox Code Playgroud)

有谁知道我做错了什么?

任何帮助深表感谢!!谢谢!!

Jos*_*ich 25

正如我在评论中所说,source默认情况下,d代码在全局环境中进行评估.设置local=TRUE为评估调用环境中的代码.

test <- function() {
  for (i in 1:length(v)) {
    LatestModelRun <- v[i]
    source("C:/R/foo.r", local=TRUE)
    print(unmatched)
  }
}
v <- c(606:608)
test()
# [1] "select * from port.tdtf_VaR_Unmatched (606)"
# [1] "select * from port.tdtf_VaR_Unmatched (607)"
# [1] "select * from port.tdtf_VaR_Unmatched (608)"
Run Code Online (Sandbox Code Playgroud)

其中foo.r包括:

unmatched <-
  paste("select * from port.tdtf_VaR_Unmatched (",LatestModelRun,")",sep="")
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 6

约书亚的答案是甜蜜而简单的.我有一个变体,允许您更明确地将参数传递给脚本:

test <- function() {
  for (i in 1:length(v)) {
    e <- new.env()
    e$LatestModelRun <- v[i]
    sys.source('c:/R/foo.R', e)
    print(e$unmatched)
  }
}
Run Code Online (Sandbox Code Playgroud)

这使用堂兄来source; sys.source允许您指定环境.环境实际上也可以是一个列表,因此如果您不需要脚本中的任何结果变量,您只需传入一个包含所需参数的列表:

sys.source('c:/R/bar.R', list(someparam=42, anotherparam=1:10))
Run Code Online (Sandbox Code Playgroud)