R 带字符串参数的过滤器

R 带字符串参数的过滤器,r,shiny,dplyr,R,Shiny,Dplyr,这很管用(在闪亮中很好): 这是: filter_(mtcars, "mpg > 24", "disp > 75") 有没有一种方法可以让它也起作用 filter_(mtcars, "mpg > 24, disp > 75") 这是另一种选择 filter_(mtcars, "mpg > 24 & disp > 75") 编辑1 这是可行的,但有更好的方法吗 filter_(mtcars,unlist(strsplit("mpg > 24,

这很管用(在闪亮中很好):

这是:

filter_(mtcars, "mpg > 24", "disp > 75")
有没有一种方法可以让它也起作用

filter_(mtcars, "mpg > 24, disp > 75")
这是另一种选择

filter_(mtcars, "mpg > 24 & disp > 75")
编辑1

这是可行的,但有更好的方法吗

filter_(mtcars,unlist(strsplit("mpg > 24, disp > 75", ",")))
编辑2

上一次编辑可能无法按预期工作。它相当于以下内容:

filter_(mtcars,c("mpg > 24", "disp > 75"))
其中忽略第二个条件

  mpg cyl  disp  hp drat   wt qsec vs am gear carb
  1 24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
  2 32.4   4  78.7  66 4.08 2.20 19.5  1  1    4    1
  3 30.4   4  75.7  52 4.93 1.61 18.5  1  1    4    2
  4 33.9   4  71.1  65 4.22 1.83 19.9  1  1    4    1
  5 27.3   4  79.0  66 4.08 1.94 18.9  1  1    4    1
  6 26.0   4 120.3  91 4.43 2.14 16.7  0  1    5    2
  7 30.4   4  95.1 113 3.77 1.51 16.9  1  1    5    2

所以我在这里的假设是,您从
textInput
中获取过滤参数,因此它们以文本的形式出现。以下是一种有效的方法:

library(dplyr)
Args<-c("mpg>24, disp>75")
eval( parse( text=paste("filter(mtcars,",Args,")")    ))

   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
2 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
3 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
4 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
5 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
6 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
库(dplyr)

Args为了完整性,我将放弃使用
gsub
在字符串中用符号替换逗号的解决方案(可能很简单):

filter_(mtcars, gsub(',', '&', "mpg > 24, disp > 75"))

   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
2 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
3 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
4 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
5 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
6 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2

如果您将该条件作为一个裸表达式输入到
过滤器中,或者如果没有逗号,或者如果用户选择使用
&
,并且不涉及在任意表达式上使用
eval
的潜在风险,这将生成与您预期相同的输出。

替代(
&
)比我强多了。也更一般,因为您可以使用其他操作符,例如
|
。如何使用
过滤器(mtcars,c(“mpg>24”,“disp>75”)
?您所面临的问题到底是什么?您可能是对的@flodel,但我希望有一个选项,即输入是“标准”dplyr notationTry
do.call(filter,c(list(mtcars),unlist(strsplit(“mpg>24,disp>75”,“,”)
)。我无法测试,因为您没有提供可复制的示例。FWIW try
filter(mtcars.dots=c(“mpg>24”,“disp>75”)
谢谢您的输入。我以前在“子集”中使用过这种方法。工作很好,但我正在努力减少我的评估分析摄入量。当在服务器上运行时,我假设hadley或flodel方法的安全风险相比之下更低
filter_(mtcars, gsub(',', '&', "mpg > 24, disp > 75"))

   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
2 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
3 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
4 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
5 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
6 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2