R函数中如何将输入变量名作为文件名一部分生成txt文件
解决R函数中输入变量名转字符串拼接文件名的问题
你的问题核心是在使用非标准求值的函数参数时,无法将输入的变量符号转为字符串用于文件名拼接。在tidyverse的函数里,{{var1}}能帮你处理数据集中的变量引用,但直接调用var1得到的是一个符号对象(比如输入am时,var1是<symbol am>),不是字符串"am",所以拼出来的文件名会出错。
两种解决方法:
方法1:用tidyverse的rlang工具(推荐)
使用rlang::ensym()将输入的参数转为符号对象,再用rlang::as_name()转成字符串:
修改后的完整函数代码:
library(tidyverse) library(janitor) library(skimr) f1 = function(dataset, var1, var2){ # 将输入的变量名转为字符串 var1_str <- rlang::as_name(rlang::ensym(var1)) # 使用tabyl检查var1 print(tabyl(dataset, {{var1}})) # 筛选var1 == 1的行生成新数据集 df = dataset %>% filter({{var1}} == 1) print(tabyl(df, {{var1}})) df1 = df %>% select(mpg, cyl, disp, hp, drat, {{var1}}, {{var2}}) # 用skim()生成数据集摘要 skim(df1) # 输出为txt文件: write.table(df1, paste0("Desktop/output_", var1_str, # 这里用转好的字符串 "1.txt"), sep = "\t", row.names = F, quote = F) } # 测试调用 f1(mtcars, var1 = am, var2 = carb) # 生成output_am1.txt f1(mtcars, var1 = vs, var2 = gear) # 生成output_vs1.txt
方法2:用基础R的方法
如果不想依赖rlang包,可以用deparse(substitute(var1))直接把符号转为字符串:
var1_str <- deparse(substitute(var1))
替换上面函数里的对应行即可,效果完全一致。
原理说明
ensym(var1)会捕获你传入的参数(比如am)并转为符号对象,相当于把用户输入的变量名"打包"成R能识别的符号格式。as_name()则把这个符号对象转为对应的字符串("am"),这样就能正常拼接到文件名里了。
内容的提问来源于stack exchange,提问作者celilati
相关产品推荐
相关产品推荐

