我想从带有动态过滤器的sql server中提取一些数据.我正在以下列方式使用伟大的R包dplyr:
#Create the filter
filter_criteria = ~ column1 %in% some_vector
#Connect to the database
connection <- src_mysql(dbname <- "mydbname",
user <- "myusername",
password <- "mypwd",
host <- "myhost")
#Get data
data <- connection %>%
tbl("mytable") %>% #Specify which table
filter_(.dots = filter_criteria) %>% #non standard evaluation filter
collect() #Pull data
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常但现在我想以某种方式在我的表的所有列上循环它,因此我想将过滤器编写为:
#Dynamic filter
i <- 2 #With a loop on this i for instance
which_column <- paste0("column",i)
filter_criteria <- ~ which_column %in% some_vector
Run Code Online (Sandbox Code Playgroud)
然后使用更新的过滤器重新应用第一个代码.
不幸的是,这种方法没有给出预期的结果.实际上它没有给出任何错误,但是甚至没有将任何结果拉入R.特别是,我看了两个代码生成的SQL查询,并且有一个重要的区别.
第一个工作代码生成表单的查询:
SELECT ... FROM …Run Code Online (Sandbox Code Playgroud) 我想使用dplyr的新NSE表示法(版本> = 0.6)对filter数据进行动态处理。假设我有以下虚拟数据集:
df = data_frame(x = 1:10, y = 10:1, z = 10 * runif(10))
Run Code Online (Sandbox Code Playgroud)
如果现在我想过滤列tofilter = "x"中大于5的值,我知道可以这样做:
df %>%
filter((!!rlang::sym(tofilter)) >= 5)
Run Code Online (Sandbox Code Playgroud)
问题1
如果我也想动态更改过滤器的运算符(假设我有一个Shiny App,用户可以在其中动态selectInput过滤数据是否大于5,等于5或小于5的值)怎么办?
我想做的是以下事情:
op = ">="
val = 5
filt_expr = paste("x", op, val)
df %>%
filter(filt_expr)
Run Code Online (Sandbox Code Playgroud)
显然,这是行不通的,并且我在使用rlang定额/符号等方面有些过,但是没有找到正确的方法来“引用”我的输入。
问题2
额外的问题是,如果我想应用多个过滤器怎么办?我是否需要循环,还是可以创建一系列过滤表达式并将其一次性应用?
例如Shiny App,用户可以在其中键入他/她想要应用于数据的多个条件,以便我们可以动态更改格式列表:
filt_expr_list = list("x >= 5", "y <= 10", "z >= 2")
Run Code Online (Sandbox Code Playgroud)
并且我们要动态地全部应用它们,以便输出等效于:
df %>%
filter(x >= 5, y <= 10, z >= 2) …Run Code Online (Sandbox Code Playgroud)