我在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])
}
}
答案 0 :(得分:2)
在R中没有简单的方法来传递引用行为,只有一个例外:environment
。我不确定environment
是否适合您的需求,您可以尝试一下:
modify_input <- function(x){
x$z <- 1
}
x <- new.env(parent = emptyenv())
modify_input(x)
x$z
就使用情况而言,environment
支持e$z
和e[["z"]]
以及length(e)
,就像list
一样,但它不支持e[[1]]
和那样的事情。您可以将environment
视为字典,其中的元素没有顺序。如果要列出environment
中的所有元素,可以使用ls
。有一些方法可以将environment
转换为list
(as.list
),反之亦然(list2env
)。希望它可以提供帮助。
答案 1 :(得分:1)
可能您可以遵循以下方法。
x <- 1
fn <- function() {
x <<- 2
}
现在x
是2。