R中如何使用foreach遍历vector元素 相关类型与输出疑问
问题1解答
- R和Python的基础容器逻辑存在差异:Python中存储多个同类型字符串的容器是list,但R中存储同类型元素的一维序列默认是原子向量,你当前得到的
hpattern是字符型原子向量,不是列表。 - 结合你的代码逻辑具体说明:
list.files()本身返回的就是字符型原子向量,你把它转成data.frame后,用list_h30[,1]取单列时,R默认开启drop=TRUE参数,会自动把单列data.frame降维为原子向量sub()函数处理向量输入时返回的还是字符型原子向量,因此typeof(hpattern)返回character是正常结果
- 如果要得到和Python list逻辑一致的R列表,可以执行
hpattern_list <- as.list(hpattern),此时typeof(hpattern_list)会返回list。
问题2解答
- 核心原因是for循环和foreach的返回逻辑不同:
- R的for循环没有返回值,你在循环体内写
print(hpi)只会输出每次打印的内容,没有额外的整体返回结果输出 - foreach是有显式返回值的:你指定了
.combine='c'参数,foreach会把每次循环体最后一行代码的返回值收集起来,用c()合并成一个整体返回。而print()函数的返回值就是它打印的对象本身,因此4次循环的返回值会被合并为一个长度为4的字符向量 - 你直接运行foreach表达式没有赋值给变量时,R会默认打印表达式的返回值,因此最后多出的那一行就是foreach返回的合并向量的打印结果。
- R的for循环没有返回值,你在循环体内写
- 解决方法:要么把foreach的结果赋值给某个变量,比如
res <- foreach(hpi=hpattern, .combine='c') %do% {print(hpi)},要么在循环体最后加一行invisible(NULL),避免返回内容被收集合并。
内容的提问来源于stack exchange,提问作者brodegon
相关产品推荐
相关产品推荐

