簡體   English   中英

在函數內調用源-作用域問題

[英]Calling source within a function - scoping issue

我正在嘗試解決函數調用中的此范圍問題。 函數Perform引發錯誤。 確切地說,錯誤是Error in eval(expr, envir, enclos) : object 'a' not found 問題是在另一個函數內的函數內調用源(即,對象aPerform函數內的CallScript函數不可用)。 Perforxm1很好-所以我想了解如何修復Perform函數。 Add_a_b.R文件是僅用於測試目的的a+b腳本)。 提前致謝。

CallScript<-function(ii){
  source(ii,echo = T,local=T)
}

Perform<-function(a,b){
  ii<-'~/Test/Add_a_b.R'
  CallScript(ii)
}

Perform1<-function(a,b){
  ii<-'~/Test/Add_a_b.R'
  source(ii,echo = T,local=T)
}

Perform(a=10,b=15)
Perform1(a=10,b=15)

我正在使用一些選項,並找到了解決該問題的方法。 但是我仍然缺乏理解。 因此,我在這里記錄我針對不同場景的發現。 希望這對人們有所幫助!

# 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)

使事情復雜化的是另一種情況。 除了local=F以外,所有這三個選項在此情況下均有效。

# 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)

在@MrFlick的建議下,這也有效:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM