Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中串联变量matlabfile的字符串名称_R_Csv_While Loop_Concatenation_Mat - Fatal编程技术网

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

在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

我有一个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
}

“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
不起作用。对于
[[“数据”]]
位来说,这没什么大不了的,但因为其他所有东西都在使用
[[
它看起来很好,保持一致。