在R中串联变量matlabfile的字符串名称
我有一个matlab文件,里面每个变量的名称中都有一个整数(除了第一个)。我想循环连接整数的名称。 这是我的代码:在R中串联变量matlabfile的字符串名称,r,csv,while-loop,concatenation,mat,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
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
}
“intruvable”在法语中是“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=…))
如果您将粘贴到一起的字符串具有正确的语法,它可能会起作用。但这可能很难阅读和调试。6个月后,如果您回顾此代码并需要理解或修改它,它将令人困惑
另一种方法是使用带有字符串的[[
来提取子列表
vols = paste0("vol.PJM", 2:7)
for (vol in vols) {
write.csv(mat[[vol]][["data"]][[4]][[1]],
paste0(vol, ".csv"))
}
我认为它更具可读性,而且很容易预先调试vols
向量,以确保所有名称都是正确的。同样,如果要循环所有元素,可以将vols
初始化为类似名称(mat)的内容
,或者使用某种正则表达式条件从名称(mat)
中提取适当的子列表。在这里,您需要混合使用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=…))
如果您将粘贴到一起的字符串具有正确的语法,它可能会起作用。但这可能很难阅读和调试。6个月后,如果您回顾此代码并需要理解或修改它,它将令人困惑
另一种方法是使用带有字符串的[[
来提取子列表
vols = paste0("vol.PJM", 2:7)
for (vol in vols) {
write.csv(mat[[vol]][["data"]][[4]][[1]],
paste0(vol, ".csv"))
}
我认为它更具可读性,而且很容易预先调试vols
向量,以确保所有名称都是正确的。同样,如果要循环所有元素,可以将vols
初始化为类似名称(mat)的内容
,或者使用某种正则表达式条件从名称(mat)
中提取适当的子列表。非常感谢您提供了这个非常详细的答案。您的最终解决方案非常优雅。只需问一个问题:[[
与$
相比有什么变化?[
可以与字符串一起使用(因此,名称存储为变量中的字符串),而$
是一种“神奇的快捷方式”,不能处理字符串。因为vol
是一个字符串,mat[[vol]]
起作用,而mat$vol
不起作用。对于[[data]]
位来说,这没什么关系,但因为其他所有东西都在使用[[
保持一致似乎很好。非常感谢您提供了这个非常详细的答案。您的最终解决方案非常优雅。只是一个问题:[
与$
相比有什么变化?[
可以与字符串一起使用(因此可以将名称作为字符串存储在变量中),而$
是“神奇的快捷方式”对字符串不起作用。因为vol
是一个字符串,mat[[vol]
起作用,而mat$vol
不起作用。对于[[“数据”]]
位来说,这没什么大不了的,但因为其他所有东西都在使用[[
它看起来很好,保持一致。