R 是否使用带引号的参数作为闭包实例化的变量名?
我的大部分问题都是在我提供的reprex中以评论的形式写的。我希望改进代码的语义,并回答一个关于引用变量作为闭包函数参数的特定问题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分析下一个最后一
库(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
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