【问题标题】:Concatenating string names of variables matlabfile in R在R中连接变量matlabfile的字符串名称
【发布时间】:2017-01-17 23:37:16
【问题描述】:

我有一个 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”在法语中的意思是“未找到”。

【问题讨论】:

    标签: r csv while-loop concatenation mat


    【解决方案1】:

    您在这里混合了需要使用get 和需要使用eval(parse()) 的位置。

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

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

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

    所以,你可以重写你的循环,用eval(parse(text = ...)) 替换get(...),它可能会工作,假设你有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) 中提取适当的子列表。

    【讨论】:

    • 非常感谢您提供如此详细的回答。您的最终解决方案非常优雅。只是一个问题:与$ 相比,[[ 有何变化?
    • [[ 可以与字符串一起使用(因此可以将名称作为字符串存储在变量中),而 $ 是一个“神奇的快捷方式”,它不适用于字符串。因为vol 是一个字符串,所以mat[[vol]] 有效,而mat$vol 无效。 See this question for more details。对于[["data"]] 位,这并不重要,但由于其他所有内容都在使用[[,因此保持一致似乎很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多