![](/img/trans.png)
[英]Parameter passing in R when interior function arguments are dependent on optional parameters
[英]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(),條件是在...
存在某些內容。 但據我所知,這根本沒有任何作用。
因此,三個問題:
...
中使命名實參(即通過標簽分配了名稱的實參),就好像名稱是正式的一樣?
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.