我的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”在法语中意为“未找到”。
答案 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)
中提取相应的子列表。