在 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 = ...))
并且它可能会起作用,假设您 paste
d 在一起的字符串具有正确的语法。但这可能难以阅读和调试。 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=]
我有 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 = ...))
并且它可能会起作用,假设您 paste
d 在一起的字符串具有正确的语法。但这可能难以阅读和调试。 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=]