使用dplyr和闪亮的非标准评估

时间:2015-05-28 00:41:25

标签: r shiny dplyr

我希望有人可以在闪亮的应用程序中将变量名称传递给dplyr时帮助我进行非标准评估。我的目的是能够选择要传递给函数selecttop_n的变量。我知道select函数对于NSE有一个等价的select_,但我也在努力让它在闪亮的应用程序中工作。

我在下面添加了一个示例,其中有两条注释行,我希望能够正常工作。第一个注释行旨在从输出表中删除由input$var_to_rank标识的列,而第二个注释行(使用top_n)应设置要显示的排名最高的行数,并将列设置为基数那些排名靠前。

library(shiny)
library(dplyr)
data(iris)

shinyApp(
  ui = basicPage(
selectInput("species", "species", choices = levels(iris$Species)),
selectInput("var_to_drop", "Variable to drop", choices = names(iris)[3:4]),
selectInput("var_to_rank", "Variable to rank", choices = names(iris)[1:2]),
numericInput("n.obs", "Top N", 5),

    tableOutput("table")
),

server = function(input, output) {


output$table <- renderTable({

  iris %>% 
    filter(Species == input$species) %>%
  # select_(quote(-input$var_to_drop)) %>%
    top_n(5, Sepal.Length)
  # top_n(n.obs, input$var_to_rank)
  })
}
)

非常感谢任何帮助和道歉,如果这个问题在其他地方得到解答。

1 个答案:

答案 0 :(得分:3)

解决您的第一个问题:这就是您如何通过NSE实现您想要的目标

select_(lazyeval::interp(~ -var, var = as.name(input$var_to_drop)))

可能有一种更简单/更短的方式,但这有效。我知道如果你想要包含而不是删除列,这可能会简单得多,我无法找出适用于-

的更短代码

对于您的第二个问题,您可以达到与top_n类似的效果

cutoff <- iris %>% .[[input$var_to_rank]] %>% sort %>% rev %>% .[input$n.obs]
iris %>% filter_(lazyeval::interp(~ var >= cutoff, var = as.name(input$var_to_rank)))

为了完整起见,我将原来的答案留给第二个问题:
对于您的第二个问题,这是一个稍有不同的解决方案。我不确定这是不是你想要的。使用top_n(5)可能会返回超过5行,因此我做了类似的事情,但确保只返回5行

iris %>% arrange_(input$var_to_rank) %>% tail(input$n.obs)