我有一个多维数组(B_matrix),我需要填充一些随机值。由于维度取决于用户定义的两个参数K和C,我不能使用嵌套循环来填充数组,因此我决定以递归方式填充它。
递归函数(fillUp)的问题在于,即使数组在函数外声明,数组在运行函数后也设置为NULL。
B_dim = rep(2,((K+1+C)*2))
B_matrix = array( dim = B_dim, dimnames = NULL)
string = c()
fillUp<-function(level, string ){
if (level>=1){
for(i in c(1,2)){
Recall(level-1, c(string, i))
}
}else{
B_matrix[string] = 1;
}
}
fillUp(length(B_dim), string)
> sum( B_matrix == 1)
[1] NA
我是R的新手,所以我不确定&#34;全球&#34;声明允许fillUp更改矩阵的值。
编辑: 注意该行
B_matrix[string] = 1;
只是一个测试用例,最初的想法是分配一些取决于数组元素位置的随机值。
EDIT2:
基于@Bridgeburners所暗示的,我几乎就在那里。用
替换B_matrix [string] = 1 assign('str', matrix(string,1), envir=.GlobalEnv)
assign('hl', B_half_length, envir=.GlobalEnv)
rul <-runif(1, 0, sum(str[1:hl]))
with( .GlobalEnv,B_matrix[str] <- rul)
我收到错误(最后一行):
Error in eval(expr, envir, enclos) : object 'rul' not found
问题,我想,我是在同时处理来自两个不同环境的变量。我不知道如何继续这里。
此选项不起作用
assign('str',matrix(string,1), envir=.GlobalEnv)
assign('hl', B_half_length, envir=.GlobalEnv)
assign('ru', runif(1, 0, sum(str[1:hl])), envir=.GlobalEnv)
with( .GlobalEnv,B_matrix[str] <- ru)
Note: no visible binding for global variable 'ru'
EDIT3:
我终于解决了它:
assign('str',matrix(string,1), envir=.GlobalEnv)
with( .GlobalEnv, B_matrix[str] <- runif(1, 0, sum(str[1:B_half_length])-B_half_length+1) )
其中B_half_length是全局变量
答案 0 :(得分:1)
只要某个流程在某个功能中运行,它就会在不同的环境中工作。对象&#34; B_matrix&#34;在全球环境中定义。由于您的嵌套环境(2 *(K + C + 1)次),您不会影响原始对象。如果你只是替换行
B_matrix[string] = 1;
带
assign('str', matrix(string,1), envir=.GlobalEnv)
with(.GlobalEnv,B_matrix[str] <- 1)
您的代码将有效。您只需指定表达式所处的环境。(在第一行中,您将&#34的本地值传递给字符串&#34;到名为&#34; str&#34;的全局对象。 )
另请注意,使用向量索引数组并不起作用。 也就是说,&#34; B_matrix [2,2,2,2,2,2]&#34;与&#34; B_matrix [c(2,2,2,2,2,2)]&#34;不同。 但它适用于矩阵
答案 1 :(得分:0)
初始化B_matrix数组后,您可以使用以下行代码实现所需的内容:
B_matrix[] <- runif(length(B_matrix))