R 是否使用带引号的参数作为闭包实例化的变量名?

R 是否使用带引号的参数作为闭包实例化的变量名?,r,dplyr,purrr,rlang,tidyeval,R,Dplyr,Purrr,Rlang,Tidyeval,我的大部分问题都是在我提供的reprex中以评论的形式写的。我希望改进代码的语义,并回答一个关于引用变量作为闭包函数参数的特定问题 库(tidyverse) #文件路径的df被拆分,因此所有的基名 #在同一列中,但父目录 #分布在大量的列中 #充满了纳的。 dat#A tibble:5 x 4 #>ref01 ref02 ref03目标 #> #>1分析测试1 #>2分析测试2 #>3分析下一步。test3 #>4分析下一步。test4 #>5分析下一个最后一

我的大部分问题都是在我提供的reprex中以评论的形式写的。我希望改进代码的语义,并回答一个关于引用变量作为闭包函数参数的特定问题

库(tidyverse)
#文件路径的df被拆分,因此所有的基名
#在同一列中,但父目录
#分布在大量的列中
#充满了纳的。
dat#A tibble:5 x 4
#>ref01 ref02 ref03目标
#>                  
#>1分析测试1
#>2分析测试2
#>3分析下一步。test3
#>4分析下一步。test4
#>5分析下一个最后一个。test5
此函数用于清除“目标”测试基名。 所有测试名称前面都有“父目录名”和句点。 (例如“最后一次测试5”)

此函数接受一个“target”列和任意数量的 父目录列。它反转父目录和 查找第一个非NA值。然后将该值与 目标值并将其删除

我的问题就在这个职能范围内:

mutate_target <- function(.tbl, .key, ...){

  # No change from the OP
  replace_pattern <- function(target, ...){
    args <- c(...)
    pattern <- args %>%
      rev() %>%
      discard(is.na) %>%
      first() %>%
      paste0("\\.")

    unlist(str_remove(target, pattern))
  }

  result <- .tbl %>% select( target={{.key}}, ... ) %>% pmap_chr( replace_pattern )
  .tbl %>% mutate( {{.key}} := result )
}
dat %>% mutate_target( target, ref01:ref03 )                           # Works
dat %>% rename( abc = target ) %>% mutate_target( abc, ref01:ref03 )   # Also works
  • 有没有更具语义的方法来构建这个函数 这样它就可以在“mutate()”函数中表达了
  • 当前,
    replace\u pattern()
    函数依赖于
    .key
    列标题为“target”,并且 作为输入参数进行硬编码

    这是因为“pmap”是通过取p-num来工作的 列表中的参数以及与名称匹配的参数

    因为我想让这个函数在任意深度下工作 文件路径,我需要找到一种方法来处理不同的
    .key
    名称

    是否有方法引用
    .key
    变量,以便
    replace\u pattern()
    函数的第一个参数的名称


  • 由(v0.3.0)于2020年4月8日创建,回答问题1

    当您说您通常看不到传递给
    mutate()
    dat
    时,这是因为大多数函数通常不需要数据帧上下文。例如,当你看到

    mtcars %>% mutate( cyl = sqrt(cyl) )
    
    函数
    sqrt()
    直接处理传递给它的值,而不关心这些值来自何处。在本例中,您需要数据框上下文来帮助解析
    ref01:ref03
    表达式。因此,更合适的模式是将
    mutate()
    操作放在函数中,让它返回结果数据帧


    回答问题2

    pmap()
    仅当输入是命名列表时匹配参数名称。如果列表未命名,则按位置进行匹配。因此,您可以1)取消命名参数列表:

    .tbl[,c(key, loc)] %>% as.list() %>% unname %>% pmap_chr(replace_pattern)
    
    或者2)由于您已经使用
    [
    对列进行了子集设置,请将其转换为适当的
    选择模式,并相应地重命名所选列:

    .tbl %>% select( target={{.key}}, ... ) %>% pmap_chr( replace_pattern )
    
    将所有内容放在一起

    考虑到两点,以下是我重写函数的方式:

    mutate_target <- function(.tbl, .key, ...){
    
      # No change from the OP
      replace_pattern <- function(target, ...){
        args <- c(...)
        pattern <- args %>%
          rev() %>%
          discard(is.na) %>%
          first() %>%
          paste0("\\.")
    
        unlist(str_remove(target, pattern))
      }
    
      result <- .tbl %>% select( target={{.key}}, ... ) %>% pmap_chr( replace_pattern )
      .tbl %>% mutate( {{.key}} := result )
    }
    
    dat %>% mutate_target( target, ref01:ref03 )                           # Works
    dat %>% rename( abc = target ) %>% mutate_target( abc, ref01:ref03 )   # Also works