R中对象的串行修改

时间:2015-06-22 14:34:44

标签: r oop

我有许多相同大小的矩阵:

m1.m <- matrix(c(1,2,3,4), nrow=2, ncol=2)
m2.m <- matrix(c(5,6,7,8), nrow=2, ncol=2)
...

我想为所有这些设置统一的列名和行名。

目前我这样做:

new_col_names <- c("Col1","Col2")
new_row_names <- c("Row1","Row2")
change_names <- function(m, new_col_names, new_row_names) {
  colnames(m) <- new_col_names
  rownames(m) <- new_row_names
  return(m)
}
m1.m <- change_names(m1.m, new_col_names, new_row_names)
m2.m <- change_names(m2.m, new_col_names, new_row_names)
...

有没有办法进行串行修改(在传递给函数时克服对象的复制)?到目前为止,我试图在lapply内运行替换函数;但是,它似乎没有这种方式。

1 个答案:

答案 0 :(得分:6)

我会使用mgetls(以及根据矩阵名称的一些正则表达式)创建所有矩阵的列表,然后使用lapply一次修改所有矩阵以及colnames<-rownames<-替换功能。这些行之间的东西

l <- mget(ls(patter = "m\\d+.m"))
lapply(l, function(x) {
                       x <- `colnames<-`(x, new_col_names) 
                       `rownames<-`(x, new_row_names)
                      })
# $m1.m
#      Col1 Col2
# Row1    1    3
# Row2    2    4
# 
# $m2.m
#      Col1 Col2
# Row1    5    7
# Row2    6    8

通常建议您将对象保留在列表中而不是污染全局环境,因此尽量不要听任何会告诉您使用list2env作为下一步的人。