假设我们有以下数据:

tib <- tibble::tibble(x = 1:10)

然后,假设我们想要创建一个函数,该函数接受一列作为输入,并返回带有几个添加列的tibble,如下所示:

library(dplyr)
generate_transformations <- function(data, column){
    transform <- sym(column)
    data %>% 
        mutate(
            sqrt = sqrt(!!transform),
            recip = 1 / !!transform,
            log = log(!!transform)
        )
}
# Usage is great:
tib %>% 
    generate_transformations('x')
# A tibble: 10 x 4
       x  sqrt recip   log
   <int> <dbl> <dbl> <dbl>
 1     1  1    1     0    
 2     2  1.41 0.5   0.693
 3     3  1.73 0.333 1.10 
 4     4  2    0.25  1.39 
 5     5  2.24 0.2   1.61 
 6     6  2.45 0.167 1.79 
 7     7  2.65 0.143 1.95 
 8     8  2.83 0.125 2.08 
 9     9  3    0.111 2.20 
10    10  3.16 0.1   2.30

现在我的问题是,有没有办法避免重复引用(!!)transform? 是的,我可以,例如,暂时重新命名column,然后在我完成后重新命名它,但这不是我对这个问题的兴趣. 如果有一种方法可以产生一个不需要!!的变量,我很感兴趣. 当它是does not work的时候,我在寻找类似的东西:

generate_transformations <- function(data, column){
    transform <- !!sym(column) # cannot unquote here :(
    data %>% 
        mutate(
            sqrt = sqrt(transform),
            recip = 1 / transform,
            log = log(transform)
        )
}

推荐答案

data转换为字符串和子集并使用转换

generate_transformations <- function(data, column){
    transform <- data[[rlang::as_string(ensym(column))]]
    data %>% 
        mutate(
            sqrt = sqrt(transform),
            recip = 1 / transform,
            log = log(transform)
        )
}

-测试

tib %>% 
     generate_transformations('x')
# A tibble: 10 × 4
       x  sqrt recip   log
   <int> <dbl> <dbl> <dbl>
 1     1  1    1     0    
 2     2  1.41 0.5   0.693
 3     3  1.73 0.333 1.10 
 4     4  2    0.25  1.39 
 5     5  2.24 0.2   1.61 
 6     6  2.45 0.167 1.79 
 7     7  2.65 0.143 1.95 
 8     8  2.83 0.125 2.08 
 9     9  3    0.111 2.20 
10    10  3.16 0.1   2.30 

或者创建一个临时列并在以后将其删除

generate_transformations <- function(data, column){
   
    data %>% 
        mutate(transform = !! rlang::ensym(column),
            sqrt = sqrt(transform),
            recip = 1 / transform,
            log = log(transform), 
            transform = NULL
        )
}

-测试

tib %>% 
     generate_transformations('x')
# A tibble: 10 × 4
       x  sqrt recip   log
   <int> <dbl> <dbl> <dbl>
 1     1  1    1     0    
 2     2  1.41 0.5   0.693
 3     3  1.73 0.333 1.10 
 4     4  2    0.25  1.39 
 5     5  2.24 0.2   1.61 
 6     6  2.45 0.167 1.79 
 7     7  2.65 0.143 1.95 
 8     8  2.83 0.125 2.08 
 9     9  3    0.111 2.20 
10    10  3.16 0.1   2.30 

R相关问答推荐

如何将标签移动到堆叠甜甜圈图表中每个切片的边缘?

有没有方法将paste 0功能与列表结合起来?

具有多个依赖变量/LHS的逻辑模型

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

R:更新后无法运行控制台

多重RHS固定估计

S用事件解决物质平衡问题

移除仪表板Quarto中顶盖和车身之间的白色区域

如果可能,将数字列转换为整数,否则保留为数字

合并DFS列表并将索引提取为新列

按多列统计频次

从多层嵌套列表构建Tibble?

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

如何对r中包含特定(未知)文本的行求和?

使用R将简单的JSON解析为嵌套框架

如何提取R中其他字符串和数字之间的字符串?

在散点图中使用geom_point放置线图例

数值型数据与字符混合时如何进行绑定

用多边形替换地块点

有没有办法通过str_Detect()或其他字符串匹配函数来连接两个长度不等的数据帧?