使用tidyfst与map_dfr过滤fst文件时变量传参失效问题求助
问题描述
我正在使用tidyfst和purrr::map_dfr读取多个fst格式文件中的数据,以下示例代码可正常运行:
library(tidyverse) library(fst) library(tidyfst) # 获取当前目录下所有fst文件 files_fst <- file.path(list.files(pattern = ".fst")) df <- map_dfr(files_fst, ~ parse_fst(.) %>% filter_fst(country == "France")) %>% bind_rows()
但将过滤字符串存入变量后,使用该变量进行过滤的代码却无法正常工作:
country_in <- "France" df <- map_dfr(files_fst, ~ parse_fst(.) %>% filter_fst(country == country_in)) %>% bind_rows()
请问该问题的原因是什么?
问题原因
这是因为filter_fst()采用**非标准求值(NSE)**机制,它会直接在fst文件的上下文里解析过滤表达式,而非从当前R环境中查找变量:
- 直接写
country == "France"时,字符串常量会被直接传入过滤逻辑,能正确匹配数据列; - 使用变量
country_in时,filter_fst()会错误地把country_in当作数据框的列名去查找,而非引用你定义的环境变量,自然找不到匹配内容,导致过滤失效。
另外,purrr::map_dfr()的匿名函数创建了闭包环境,filter_fst()的NSE机制无法穿透这个闭包捕获外部的country_in变量,进一步导致变量无法被正确识别。
内容的提问来源于stack exchange,提问作者mgrund
相关产品推荐
相关产品推荐

