2015-04-23 83 views
-1

我有一個多維數組(B_matrix),我需要填充一些隨機值。由於維度取決於用戶定義的兩個參數K和C,因此我不能使用嵌套循環來填充數組,因此我決定遞歸填充它。以R語言遞歸填充數組

遞歸函數(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新手,所以我不確定「全局」聲明是否允許fillUp更改矩陣的值。

編輯: 注意,線

B_matrix[string] = 1; 

只是測試情況下,與原來的想法是分配取決於該陣列元件的位置的一些隨機值。

EDIT2:

基於什麼@Bridgeburners暗示,我幾乎沒有。通過

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) 

我的錯誤(最後一行)更換B_matrix [字符串] = 1:

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

這是什麼功能(字)的目標是什麼?在R函數中,您不應該嘗試修改函數範圍之外的對象;相反,你從你的函數返回修改後的對象。我只是很難理解這段代碼的意圖和期望的輸出。請做一個更完整的[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – MrFlick

+0

這個想法是用一些隨機函數它的參數取決於數組元素的位置,但是如果我不能指定一個常數值(1),我將無法走得更遠... – user3889486

+0

我不明白爲什麼你認爲你需要在這裏遞歸。同樣,由於這個特殊的例子不可重現,也沒有需要驗證的輸出,所以建議「適當的」選擇是非常困難的。 – MrFlick

回答

1

每當過程在一個功能內工作,它在不同的環境中工作。對象「B_matrix」在全局環境中定義。由於您嵌套環境(2 *(K + C + 1)次),因此您不會影響原始對象。如果只需更換線

B_matrix[string] = 1; 

assign('str', matrix(string,1), envir=.GlobalEnv) 
with(.GlobalEnv,B_matrix[str] <- 1) 

您的代碼將工作。您只需指定表達式在哪個環境中工作(在第一行中,您將「string」的本地值傳遞給名爲「str」的全局對象)。

請注意,索引與矢量陣列不起作用。 也就是說,「B_matrix [2,2,2,2,2,2]」不同於「B_matrix [c(2,2,2,2,2,2)]」。 但它與一個矩陣

0

工作你想可以用下面的代碼行,一旦你已經初始化,您B_matrix陣列來實現什麼:

B_matrix[] <- runif(length(B_matrix))