用R语言

时间:2015-04-23 21:29:34

标签: r recursion

我有一个多维数组(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是全局变量

2 个答案:

答案 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))