在我正在研究的事情上,我遇到了一些打嗝.假设我有以下简单示例.让...
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)
约书亚的答案是甜蜜而简单的.我有一个变体,允许您更明确地将参数传递给脚本:
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)
| 归档时间: |
|
| 查看次数: |
9580 次 |
| 最近记录: |