在R中连接变量matlabfile的字符串名称

时间:2017-01-17 23:37:17

标签: r csv while-loop concatenation mat

我的matlab文件在我的变量的每个名称中都有一个整数(第一个除外)。我想循环以连接整数的名称。 有我的代码:

library('R.matlab')
mat <- readMat('SeriesContPJM.mat')
#str(mat)
#typeof(mat)
                                        #mat[[1]]
write.csv(mat$vol.PJM$data[[4]][[1]], "PJM.csv")
i = 2
while (i < 7)
{
    write.csv(get(paste("mat$vol.PJM", as.character(i), "$data[[4]][[1]]", sep = "")), paste(paste("PJM", as.character(i), sep="_"), "csv", sep ="."))
    i = i + 1
}

我有write.csv(mat$vol.PJM$data[[4]][[1]], "PJM.csv")给了我很好的输出。我想在循环中的其他变量名称相同,但我得到以下输出:

+ Error in get(paste("mat$vol.PJM", as.character(i), "$data[[4]][[1]]",  (from importpjm.R#10) : 
  objet 'mat$vol.PJM2$data[[4]][[1]]' introuvable

“introuvable”在法语中意为“未找到”。

1 个答案:

答案 0 :(得分:2)

在此处,您需要使用get以及需要使用eval(parse())的位置进行混音。

您可以将get与字符串变量游戏结合使用,例如get("mtcars"),但[是需要评估的函数。

  • get("mtcars[2, 2]")因为您没有名为"mtcars[2, 2]"的变量而无法工作,您有一个名为"mtcars"的变量和一个名为{{的函数1}}可以接受参数"["

  • 2, 2可以正常工作,因为它不会只查找变量,它实际上会对文本字符串进行评估,就好像您将其键入命令行一样。

所以,你可以重写你的循环,将eval(parse(text = "mtcars[2, 2]"))替换为get(...),它可能会起作用,假设你所拥有的字符串eval(parse(text = ...))一起具有正确的语法。但这可能很难阅读和调试。在6个月内,如果你回顾这段代码并需要理解或修改它,那将会让人感到困惑。

另一种方法是使用带有字符串的paste来提取子列表。而不是混淆[[我会这样做:

eval(parse())

我认为它更具可读性,并且事先调试vols = paste0("vol.PJM", 2:7) for (vol in vols) { write.csv(mat[[vol]][["data"]][[4]][[1]], paste0(vol, ".csv")) } 向量很容易,以确保所有名称都正确无误。同样,如果要循环遍历所有元素,可以将vols初始化为vols,或使用某种正则表达式标准从names(mat)中提取相应的子列表。