【问题标题】:how to loop over vector elements in R with foreach如何使用foreach遍历R中的向量元素
【发布时间】:2021-11-30 23:51:16
【问题描述】:

我对 R 比较陌生,不知道如何将我的 for 循环变成 foreach 循环。

我有一个包含几个元素的向量,即

> hpattern
[1] "sim0_pmax.tif" "sim0_vmax.tif" "sim1_pmax.tif" "sim1_vmax.tif"
> typeof(hpattern)
[1] "character"

首先:我来自python词,hpattern项应该是一个列表,因为它是这样创建的

list_h30 = data.frame(list.files(path = tr30dir, pattern=paste(depthfile,".+$",sep=""), recursive = TRUE, full.names = FALSE))
hpattern <- sub(paste(".*",depthfile,sep=""), "", list_h30[,1]) 

typeof hpattern 怎么是字符而不是列表?

第二:如果我跑

for (hpi in hpattern) {print(hpi)}

我明白了

[1] "sim0_pmax.tif"
[1] "sim0_vmax.tif"
[1] "sim1_pmax.tif"
[1] "sim1_vmax.tif"

如果我跑

foreach(hpi=hpattern, .combine='c') %do% {print(hpi)}

我明白了

[1] "sim0_pmax.tif"
[1] "sim0_vmax.tif"
[1] "sim1_pmax.tif"
[1] "sim1_vmax.tif"
[1] "sim0_pmax.tif" "sim0_vmax.tif" "sim1_pmax.tif" "sim1_vmax.tif"

我不明白为什么我得到最后一个输出。

【问题讨论】:

  • 1.你为什么期待一份清单? sub 总是返回一个字符向量。 2.在学习foreach循环之前,你应该学习lapply循环。如果你理解lapply,这是一个经常使用的基本R函数,那么理解foreach循环会容易得多。最后一个输出行是foreach 循环的返回值。避免在您的示例中使用print。

标签: r loops for-loop foreach


【解决方案1】:

正如 Roland 所说,sub 返回一个字符向量(在R 中,大多数东西都是向量)。另一个检查对象的有用函数是str。

关于foreach:它结合了循环每次执行的输出。你已经指定了你想要一个向量(.combine = 'c')。

由于print 不可见地返回每个对象,每个hpi 都会在循环内打印,然后组合到最终向量。与不打印时进行比较:

foreach(hpi=hpattern, .combine='c') %do% {hpi}
[1] "sim0_pmax.tif" "sim0_vmax.tif" "sim1_pmax.tif" "sim1_vmax.tif"

【讨论】:

  • 感谢您和 Roland 的回答,我一定会看看 lapply 以更好地理解 foreach
猜你喜欢
  • 2021-08-23
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多