簡體   English   中英

R:在范圍界定中,將參數傳遞給內部函數,以及

[英]R: On scoping, passing arguments to interior functions, and

下面的示例是我正在進行的尋求更好地預測R會做什么的另一個實例。 盡管已經閱讀了很多次關於匹配和作用域的材料,但我仍然難以傳遞變量,而且顯然我可能遺漏了其他規則,或者我誤解了我所擁有的某些規則,學到了。

此處ff()調用gg()四次。 這些調用的輸出如下。 在這里實例1和實例2證實了我的期望。 他們在ff的執行環境中找到aa ,在gg的函數定義的封閉環境中找到cc 但是實例2和實例3讓我感到驚訝。 對於3,我不確定會發生什么,因為我對通過...傳遞的變量是否保留其名稱還有些不確定。 如果沒有,我認為垃圾收集器可能會得到它。 但是我確實希望4將一個名為cc的值13傳遞給函數,但事實並非如此。

我的原始gg()版本沒有ls() list2env() 當我加入ls()它似乎表明, ...傳遞一個...對象,與cc內它不能訪問在函數體的cc的范圍。 請注意,在我添加all.names = TRUE之前,ls()不會顯示... 然后,我添加了list2env(),條件是在...存在某些內容。 但據我所知,這根本沒有任何作用。

因此,三個問題:

  1. list2env的問題是什么? 為什么這里沒有效果?
  2. 如何在函數內部通常可以使用的...中使命名實參(即通過標簽分配了名稱的實參),就好像名稱是正式的一樣?
  3. 與(2)相同的問題,但是關於具有名稱或名稱的變量,而沒有通過參數列表中的標記分配該名稱。

aa <- 2
bb <- 3
cc <- 11
gg <- function(X, ...){
  if(length(alist(...)) > 1){list2env(alist(...), envir = parent.frame())} 
  env_vars <- ls(all.names=TRUE)
  out <-  cc * X
  print(env_vars)
  cat(X, ",  out = ", out, "\n", sep="")
}

ff <- function(){
  aa <- 5
  bb <- 7
  cc <- 13

  gg(aa)        \# 1
  gg(X=aa)      \# 2
  gg(aa, cc)    \# 3
  gg(aa, cc=cc) \# 4
}

ff()

[1] "..." "X"  
5,  out = 55
[1] "..." "X"  
5,  out = 55
[1] "..." "X"  
5,  out = 55
[1] "..." "X"  
5,  out = 55

十分感謝你! 給固定我格式的人。

這看起來確實很奇怪,但是經過反復試驗,我們發現

L <- list(...)
list2env(L, environment())

如果已命名實際參數,則會將...變量注入當前環境。 似乎重要的是創建一個中間變量來保存列表,此處為L

通常with如果實際的參數被命名為:

g <- function(X, ...) with(list(...), {
   print(ls())
})
g(1, cc = 2)
## [1] "cc"

暫無
暫無

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

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