filter_ with string参数

时间:2014-10-29 18:27:24

标签: r shiny dplyr

这很有效(Shiny非常好):

filter_(mtcars, "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

2 个答案:

答案 0 :(得分:0)

所以我的假设是你从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

因此,在这种情况下,Args是用户的输入。我使用paste将完整的filter函数组合为一个文本字符串。最后,eval(parse (..))位只是将字符串计算为正常函数。请注意,这使用filter代替filter_

这个答案是基于对这个问题的接受答案:

Use character string as function argument

答案 1 :(得分:0)

为了完整起见,我将放弃使用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

如果您将条件作为裸表达式输入到filter中,则会生成与期望的输出相同的输出;如果没有逗号或用户选择使用&,则效果很好不会引入涉及在任意表达式上使用eval的潜在风险。