在R函数中通过引用传递列表

时间:2017-07-05 11:48:04

标签: r

我在R中有一个简单的递归函数,可以修改它的输入参数。我使用eval.parent(substitute())来对参数应用更改,但是我收到此错误: “无效(do_set)左侧指派” 有谁知道如何解决这个错误? 这是我的功能:

decompose_clade=function(ind,Small_clades_ind,Remove_tips,Clades){
  Ch=Children(tree,ind)
  if(Ch[1]<length(tree$tip.label)){
    l=Remove_tips
    l=c(l,Ch[1])
    eval.parent(substitute(Remove_tips=l))
    print("tip added=")
    print(Ch[1])
  }else if(length(extract.clade(tree,Ch[1])$tip.label)<4){
    s=Small_clades_ind
    s=c(s,Ch[1])
    eval.parent(substitute(Small_clades_ind=s))
    print("small clade added=")
    print(Ch[1])
  }else if(length(extract.clade(tree,Ch[1])$tip.label)>80){
    decompose_clade(Ch[1],Small_clades_ind,Remove_tips,Clades)
    print("function calls again")
  }else{
   m=Clades
   m=c(m,Ch[1])
    eval.parent(substitute(Clades<-m))
    print("a clade added=")
    print(Ch[1])
  }

} 

2 个答案:

答案 0 :(得分:2)

在R中没有简单的方法来传递引用行为,只有一个例外:environment。我不确定environment是否适合您的需求,您可以尝试一下:

modify_input <- function(x){
    x$z <- 1
}

x <- new.env(parent = emptyenv())
modify_input(x)
x$z

就使用情况而言,environment支持e$ze[["z"]]以及length(e),就像list一样,但它不支持e[[1]]和那样的事情。您可以将environment视为字典,其中的元素没有顺序。如果要列出environment中的所有元素,可以使用ls。有一些方法可以将environment转换为listas.list),反之亦然(list2env)。希望它可以提供帮助。

答案 1 :(得分:1)

可能您可以遵循以下方法。

x <- 1
fn <- function() {
    x <<- 2 
}

现在x是2。