I was playing with some options and found out a fix for the problem. But I am still lacking the understanding. So I am documenting my findings for different scenarios here. Hope this helps people!
# To call within another function, reference enclosing environment!!
# Fixed my problem.
# Is there any other methods to achieve this?
CallScript<-function(ii){
source(ii,echo = T, local=parent.frame())
}
Perform<-function(a,b){
ii<-'~/Test/Add_a_b.R'
CallScript(ii)
}
Perform(a=10,b=15)
# Using local=T or local=environment() options don't work in this scenario!
CallScript<-function(ii){
source(ii,echo = T, local=T)
#source(ii,echo = T, local=environment())
}
Perform<-function(a,b){
ii<-'~/Test/Add_a_b.R'
CallScript(ii)
}
Perform(a=10,b=15)
# I also found out that these also work.
Perform_env<-function(a,b){
ii<-'~/Test/Add_a_b.R'
source(ii,echo = T,local=environment())
}
Perform_loc<-function(a,b){
ii<-'~/Test/Add_a_b.R'
source(ii,echo = T,local=T)
}
Perform_env(a=10,b=15)
Perform_loc(a=10,b=15)
# But this doesn't work
Perform_par<-function(a,b){
ii<-'~/Test/Add_a_b.R'
source(ii,echo = T,local=parent.frame())
}
Perform_par(a=10,b=15)
To complicate things, here is another scenario. Except local=F, all three options work in this scenario.
# CallScript defined within `Perform` function.
Perform<-function(a,b){
CallScript<-function(ii){
# parent.frame works
#source(ii,echo = T,local=parent.frame())
# environment works
#source(ii,echo = T,local=environment())
# Local=T also work
source(ii,echo = T,local=T)
}
ii<-'~/Test/Add_a_b.R'
CallScript(ii)
}
Perform(a=10,b=15)
With @MrFlick's suggestion, this is also working:
CallScript<-function(ii){
a <- get("a", parent.frame())
b <- get("b", parent.frame())
source(ii,echo = T, local=T)
}
Perform<-function(a,b){
ii<-'~/Test/Add_a_b.R'
CallScript(ii)
}
Perform(a=10,b=15)
/.Perform1function). The issue is scoping. I want to know how to reference theperform's environment, soCallScriptfunction can findain there.