R:在范围界定上,将参数传递给内部函数,以及

时间:2018-03-28 03:08:12

标签: r scope parameter-passing

下面的例子是我不断寻求更好地预测R会做什么的另一个例子。尽管已经阅读了关于匹配和范围任意次数的材料,但我仍然难以传递变量,而且似乎很明显我还缺少其他规则,或者我误解了我的一些规则,据说,得知。

此处 //reinitializing mgm = new Specialties []{}; mgm[0].setName("abc"); 四次致电ff()。这些调用的输出如下。实例1和实例2证实了我的期望。他们在gg()的执行环境中找到aa,在ff的函数定义的封闭环境中找到cc。但实例2和3让我感到惊讶。对于3,我不确定会发生什么,因为我对通过gg传递的变量是否保留其名称仍然有点模糊。如果没有,我认为垃圾收集器可能会得到它。但我真的希望4将一个名为...的变量传递给函数,值为13,但事实并非如此。

我的cc原始版本中没有gg() ls()。当我添加list2env()时,它似乎表明ls()传递了一个...对象,其中...无法访问,而且在函数体中的cc范围内。请注意,在我添加all.names = TRUE之前,ls()没有显示cc。然后我添加了list2env(),条件是...中存在某些内容。但最好的我可以说,这根本不起作用。

所以,有三个问题:

  1. list2env怎么了?为什么这里没有效果?
  2. 如何制作命名参数(在论证意义上) 在...中通常可用的...分配了一个名称 功能好像这个名字是正式的?
  3. 与(2)相同的问题,但是对于具有a的变量 name,或是一个名称,没有通过标签分配该名称 参数列表。
  4. 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
    

    非常感谢你!修改格式的人。

1 个答案:

答案 0 :(得分:0)

这看起来很奇怪,但经过一些试验和错误我们发现

L <- list(...)
list2env(L, environment())
如果实际参数被命名,

会将...变量注入当前环境。似乎创建一个中间变量来保存列表很重要,这里L

一般情况下,如果实际参数名为:

,则可以像这样使用with
g <- function(X, ...) with(list(...), {
   print(ls())
})
g(1, cc = 2)
## [1] "cc"