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 notationTrydo.call(filter,c(list(mtcars),unlist(strsplit(“mpg>24,disp>75”,“,”)
)。我无法测试,因为您没有提供可复制的示例。FWIW tryfilter(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