将文本字符串转换为矩阵

时间:2015-03-03 12:02:31

标签: r eval

我希望从矩阵序列中添加元素。例如,

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

我没有写出每个矩阵序列,而是认为使用paste0创建所需的序列然后将结果text转换为表达式可能更方便,如下所示。我认为这样可以更容易地概括代码,也许允许在某个时刻在for-loop内包含可变数量的矩阵。

#
# 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

1 个答案:

答案 0 :(得分:2)

我建议使用array而不是解析。您可以使用abind

轻松地将矩阵绑定到一个数组中
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