Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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中使用for循环保存具有不同名称的文件?_R_Loops - Fatal编程技术网

如何在R中使用for循环保存具有不同名称的文件?

如何在R中使用for循环保存具有不同名称的文件?,r,loops,R,Loops,我有168个文件保存在一个列表中,我正试图使用for循环将它们保存到我的文件夹中。 我需要按照下面提供的方式命名文件,但我的代码现在所做的是用不同的名称保存168个文件,但它会将同一个文件保存168次,而不是循环使用单独的名称保存列表中的每个文件。 有办法吗 strings_label = c('a', 'approxequal', 'b', 'c', 'd', 'e', 'equal', 'f', 'five', 'four', 'g', 'greater'

我有168个文件保存在一个列表中,我正试图使用for循环将它们保存到我的文件夹中。
我需要按照下面提供的方式命名文件,但我的代码现在所做的是用不同的名称保存168个文件,但它会将同一个文件保存168次,而不是循环使用单独的名称保存列表中的每个文件。
有办法吗

strings_label = c('a', 'approxequal', 'b', 'c', 'd', 'e', 'equal',
                  'f', 'five', 'four', 'g', 'greater', 'greaterequal',
                  'less', 'lessqual', 'notequal', 'one', 'seven',
                  'six', 'three', 'two')
strings_number = c('01', '02', '03', '04', '05', '06', '07', '08')
suffix = '40264464'

for(p in 1:length(myelement))
  for(this_label in strings_label)
  {
    for(this_number in strings_number)
    {
      
      write.csv(myelement[[p]],
                paste0("/Users/jwolo/Documents/section_images/",
                paste(this_label, this_number, suffix, sep = "_"), ".csv"),
                row.names = TRUE)
    }
  }
}

任何帮助都将不胜感激。

当前代码将循环遍历p的每个增量的所有文件名。从而将最后一个数据帧保存到所有文件。
处理这个问题的一种方法是在内部循环中增加p

p<-1
for(this_label in strings_label){
      for(this_number in strings_number)
      {
         write.csv(myelement[[p]],
                   paste0("/Users/jwolo/Documents/section_images/",
                          paste(this_label, this_number, suffix, sep = "_"), ".csv"),
                   row.names = TRUE)
         p<- p +1
      }
}

p让我建议一些风格改进。这些不仅可以帮助您编写更好的代码,而且还可以帮助您首先编写代码,因为每个问题都将被分解成更小的、易于解决的问题

请注意,其中一些可能是很少的高级解决方案

首先,定义将生成文件名的函数:

make_filename = function(label, number){
  # these can be easily turned into parameters
  suffix = "40264464"
  dir = "/Users/jwolo/Documents/section_images/"

  # doing this, putting it all on a single line or using pipe %>%
  # is just matter of style
  filename = paste(label, number, suffix, sep="_")
  filename = paste0(filename, ".csv")
  filename = file.path(dir, filename)

  filename
}

获取两个元素的所有组合,请考虑<代码>扩展.GET。这可以与

mapply
一起使用来命名:

combinations = expand.grid("label"=string_label, "number"=string_number)
filenames = mapply(make_filename, combinations$label, combinations$number)
使用另一个
mappy
或如果您使用另一个函数,所有操作都可以在一个
mappy
调用中完成:

save_element = function(element, label, number){
  filename = make_filename(label, number)
  write.csv(element, filename,row.names=TRUE)
  }

combinations = expand.grid("label"=string_label, "number"=string_number)
mapply(save_element, myelement, combinations$label, combinations$number)
通过将各个步骤的逻辑封装到自包含的函数中,结果更具可读性,代码更不容易出现错误

说明: 所有的神奇之处在于两个函数,
expand.grid
,它们将输入向量的组合生成一个
data.frame

expand.grid(c("a","b"), c(1,2))
#  Var1 Var2
#1    a    1
#2    b    1
#3    a    2
#4    b    2
通过指定输入向量的名称,然后对列进行命名,以便我们可以指向它们,而不是使用
res[,1]
res[,2]
,这与
res$letters
res$numbers
相比可读性较差

第二个魔法是
mapply
,它只是
Map
函数的一个不同名称,您可能从不同的编程语言(例如
Python
)中知道它

虽然看起来很恐怖,
mapply
非常简单。它只使用输入的第一个元素调用函数,然后是第二个元素,依此类推。基本上是:

for(i in 1:n)
   fun(input1[i], input2[i], ..., inputk[i])

只是稍微聪明一点。

尽管缺少
{
第一个循环。你可以试着打印出
文件.path
参数部分,只是为了验证它是否是你想要的吗?就是这样,非常感谢你,我不敢相信我没有看到!有趣的东西,我对R编码非常陌生,所以我一直在使用非常基本的技术,但我肯定会尝试你建议的东西d!非常感谢