代码之家  ›  专栏  ›  技术社区  ›  andrew_reece

获取传递给另一个函数的函数向量的字符串名称

  •  1
  • andrew_reece  · 技术社区  · 3 年前

    purrr::map ). 有些是标准函数,比如 mean ,其他是用户定义的函数。

    我希望输出是一个数据帧,这些函数的名称作为存储其输出的列。

    下面的示例显示了过程和所需的输出:

    library(purrr)
    
    foo <- function(x) sd(x) * .1 # arbitrary user-defined function
    agg_funcs <- c(mean, median, foo)
    names(agg_funcs) <- c("mean", "median", "foo")
    
    fields <- c("mpg", "disp") # fields to aggregate with agg_funcs
    
    fields %>% 
      set_names(fields) %>% 
      map_df(function(x) map_df(agg_funcs, function(f) f(mtcars[[x]])), .id = "field")
    
    # A tibble: 2 x 4
      field  mean median    foo
      <chr> <dbl>  <dbl>  <dbl>
    1 mpg    20.1   19.2  0.603
    2 disp  231.   196.  12.4  
    

    但我不想说出 agg_funcs 用手。相反,我想做一些

    agg_funcs %>% set_names(agg_funcs) # doesn't work
    

    我知道我可以得到如下函数名的字符串表示:

    as.character(substitute(mean))
    # "mean"
    

    我甚至可以把这个操作包装成一个函数,一个接一个地传递我想要的agg函数:

    f <- function(func) as.character(substitute(func))
    f(mean) # "mean"
    

    此函数 f() 是我生活中想要的东西 map 操作,以获取字符串形式的函数名。
    地图 sapply 聚集函数 (原因我不完全明白):

    sapply(agg_funcs, f) # alt: map(agg_funcs, f)
    
         mean median foo 
    [1,] "[[" "[["   "[["
    [2,] "X"  "X"    "X" 
    [3,] "i"  "i"    "i" 
    

    如何在不创建 names(agg_funcs) 用手吗?

    1 回复  |  直到 3 年前
        1
  •  1
  •   akrun    3 年前

    我们可以用 lst dplyr purrr ,返回一个 list 相同的参数传递

    dplyr::lst(mean, median, foo)