如何从存储函数名的tibble中选函数并通过管道传递数据?
嘿,我明白你的问题啦!你现在的麻烦在于,你的tibble里存的是带括号的字符串(比如"log()"),而不是真正的函数对象,所以直接用functions[[1]]取出来的是一串文本,根本没法作为函数接收管道传过来的数据。而且!!这类tidyeval语法是用来处理变量引用的,在这儿确实派不上用场~
下面给你两种简单的解决办法,选适合你的就行:
方法1:直接在tibble里存储函数对象
这是最直接的方式,把函数本身(不是字符串)存到tibble的列表列里:
library(tibble) library(dplyr) # 创建存函数对象的tibble(注意用list()包裹函数) functions <- tibble(funcs = list(log, log10, sqrt)) # 测试用的数据集(比如取mtcars的mpg列) my_data <- mtcars$mpg # 通过管道调用第一个函数 my_data %>% functions$funcs[[1]]
解释一下:这里functions$funcs[[1]]取出来的是真正的log函数,管道%>%会自动把my_data作为第一个参数传给这个函数,完美实现你想要的效果!
方法2:从已有的函数名字符串转换为函数对象
如果你已经有了存带括号字符串的tibble,那先把字符串处理成纯函数名,再转换成函数对象就行:
library(tibble) library(dplyr) library(stringr) library(purrr) # 你原来的tibble functions <- tibble(func_str = c("log()", "log10()", "sqrt()")) # 第一步:去掉括号,得到纯函数名字符串;第二步:转成函数对象 functions_cleaned <- functions %>% mutate( func_name = str_remove(func_str, "\\(\\)"), # 去掉末尾的() func = map(func_name, match.fun) # 把字符串转成函数对象 ) # 调用第一个函数 my_data <- mtcars$mpg my_data %>% functions_cleaned$func[[1]]
这里用match.fun()比get()更安全,因为它会自动检查函数是否存在,避免出错。
额外小技巧:用purrr的invoke函数更灵活
如果需要传递额外参数(比如给log指定底数),可以用purrr::invoke():
# 比如调用log,指定底数为2 my_data %>% invoke(functions_cleaned$func[[1]], ., base = 2)
这样不管函数有多少参数,都能轻松传递~
内容的提问来源于stack exchange,提问作者Mooks
相关产品推荐
相关产品推荐

