2015-03-03 244 views
2

我希望從矩陣序列中添加元素。例如,將文本字符串轉換爲矩陣

d <- ifelse(i == 4, matrix1[3,3] + matrix2[3,3] + matrix3[3,3] + matrix4[3,3], matrix5[1,1]) 

而是寫出矩陣的每個序列的我想這可能是更方便的與paste0創建所需的序列,然後轉換所產生的text來表達,像下面。我認爲這會使代碼概括變得容易,可能允許在某個點包含可變數量的矩陣。

# 
# http://stackoverflow.com/questions/8196109/how-to-convert-a-string-in-a-function-into-an-object 
# http://stackoverflow.com/questions/1743698/r-eval-expression 
# 

z <- eval(parse(text=paste0('matrix',1:4,'[3,3]')), env=.GlobalEnv) 
z 

但是,上述示例僅返回元素matrix4[3,3]

我曾嘗試沒有成功如下添加sum函數修改上面的表達式:

eval(parse(text=c('sum(', paste0('matrix',1:4,'[3,3]'), ')')), env=.GlobalEnv) 

eval(sum(parse(text=c(paste0('matrix',1:4,'[3,3]')))), env=.GlobalEnv) 

感謝您對如何使這項工作的任何建議。也許有一個更簡單的方法。

下面是一個全功能的例子:

matrix1 = matrix(c( 1,  2,  3, 
         4,  5,  6, 
         7,  8,  9), nrow=3, byrow=TRUE) 

matrix2 = matrix(c( 10, 20, 30, 
         40, 50, 60, 
         70, 80, 90), nrow=3, byrow=TRUE) 

matrix3 = matrix(c( 100, 200, 300, 
        400, 500, 600, 
        700, 800, 900), nrow=3, byrow=TRUE) 

matrix4 = matrix(c(1000, 2000, 3000, 
        4000, 5000, 6000, 
        7000, 8000, 9000), nrow=3, byrow=TRUE) 

matrix5 = matrix(c(10000, 20000, 30000, 
        40000, 50000, 60000, 
        70000, 80000, 90000), nrow=3, byrow=TRUE) 

i <- 1:4  
a <- b <- c <- d <- rep(NA,4) 

a <- ifelse(i == 1, matrix1[1,1]            , matrix2[1,1]) 
b <- ifelse(i == 2, matrix1[2,2] + matrix2[2,2]        , matrix3[1,1]) 
c <- ifelse(i == 3, matrix1[2,2] + matrix2[2,2] + matrix3[2,2]    , matrix4[1,1]) 
d <- ifelse(i == 4, matrix1[3,3] + matrix2[3,3] + matrix3[3,3] + matrix4[3,3], matrix5[1,1]) 

a 
#[1] 1 10 10 10 
b 
#[1] 100 55 100 100 
c 
#[1] 1000 1000 555 1000 
d 
#[1] 10000 10000 10000 9999 

# z should equal 9999 not 9000 
z <- eval(parse(text=paste0('matrix',1:4,'[3,3]')), env=.GlobalEnv) 
z 
+5

也許'的eval(解析(文本=膏( '矩陣',1::可以很容易地使用abind結合矩陣一起成陣列4, '[3,3]',九月= 「」,崩=「+」)))' – akrun 2015-03-03 12:10:47

+1

@akrun謝謝。考慮張貼作爲答案,我會upvote它,並可能在一兩天內接受它。 – 2015-03-03 12:15:52

回答

2

我建議使用array代替解析。

library(abind) 
arr <- abind(matrix1,matrix2,matrix3,matrix4,matrix5,along=3) 

d <- ifelse(i == 4, sum(arr[3,3,1:4]), arr[1,1,5]) 
d 
[1] 10000 10000 10000 9999