R自定义函数中将列表名作为字符串传入mutate列的实现问题
问题原因
你将deparse(substitute(list_name))写在了map_df的内部匿名函数中,substitute()会在当前运行环境捕获符号名称,匿名函数的内部环境中list_name是形参名,因此最终得到的是"list_name"而非传入的实参名称。
解决方法
在进入map_df循环前,先在外层函数的环境中提前捕获传入的实参名称,存为字符串变量后再在mutate中调用即可。
修改后完整代码
# 需提前加载依赖包 library(purrr) library(dplyr) library(rbenchmark) a_list = c('a','b','c') test = function(list_name) { # 在外层函数环境预先捕获传入的列表名称 input_list_name <- deparse(substitute(list_name)) map_df(list_name, function(x) { benchmark(x = paste(x,'test')) %>% mutate(test = x, list_name_as_string = input_list_name) }) } test(a_list)
输出效果
运行修改后的代码,list_name_as_string列的所有值都会变为你需要的"a_list":
test replications elapsed relative user.self sys.self user.child sys.child list_name_as_string 1 a 100 0 NA 0 0 NA NA a_list 2 b 100 0 NA 0 0 NA NA a_list 3 c 100 0 NA 0 0 NA NA a_list
内容的提问来源于stack exchange,提问作者jkud
相关产品推荐
相关产品推荐

