适用于 NSE 和 Shiny Inputs 的 R 函数

R function that works with NSE and Shiny Inputs

我正在寻找一种简单的方法让我的函数处理来自 Shiny 的输入(即字符串输入)或典型的交互式使用,即 Tidyverse 函数与 NSE 一起启用。无需复制我的代码来分别处理每个案例。

用法示例:

library(dplyr)

flexible_input <- function(var){
  mtcars %>% 
    select(var)
}

# This works for NSE
nse_input <- function(var){
  mtcars %>% 
    select({{ var }})
}

# This works for shiny but now I am duplicated my code essentially
shiny_input <- function(var){
  mtcars %>% 
    select(.data[[var]])
}

flexible_input(mpg)
flexible_input('mpg')

如果我们需要 flexible_input 获取字符串和不带引号的输入,转换为 symbol 并计算 (!!)

flexible_input <- function(var){
  mtcars %>% 
    dplyr::select(!! rlang::ensym(var))
}

-测试

> flexible_input(mpg) %>% head
                   mpg
Mazda RX4         21.0
Mazda RX4 Wag     21.0
Datsun 710        22.8
Hornet 4 Drive    21.4
Hornet Sportabout 18.7
Valiant           18.1
> flexible_input("mpg") %>% head
                   mpg
Mazda RX4         21.0
Mazda RX4 Wag     21.0
Datsun 710        22.8
Hornet 4 Drive    21.4
Hornet Sportabout 18.7
Valiant           18.1