我对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"
我不明白为什么我得到最后一个输出。
正如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"