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

Concatenating string names of variables matlabfile in R

我有 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" 在法语中的意思是 "not found"。

在这里,您混合需要使用 get 的地方和需要使用 eval(parse()) 的地方。

您可以将 get 与字符串变量游戏一起使用,例如 get("mtcars"),但是 [ 是一个需要计算的函数。

  • get("mtcars[2, 2]") 将不起作用,因为您没有名为 "mtcars[2, 2]" 的变量,您有一个名为 "mtcars" 的变量和一个名为 "[" 可以接受参数 2, 2.

  • eval(parse(text = "mtcars[2, 2]")) 会起作用,因为它不只是查找变量,它实际上会评估文本字符串,就像您在命令行中键入它一样。

因此,您可以重写您的循环,将 get(...) 替换为 eval(parse(text = ...)) 并且它可能会起作用,假设您 pasted 在一起的字符串具有正确的语法。但这可能难以阅读和调试。 6个月后,如果你回头看这段代码,需要理解或修改,就会一头雾水。

另一种方法是使用 [[ 和字符串来提取子列表。而不是搞乱 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) 之类的东西,或者使用某种正则表达式标准从 names(mat).[= 中提取适当的子列表31=]