我希望在闪亮的应用程序中将变量名称传递给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)
  })
}
)


如果在其他地方回答此问题,非常感谢您的帮助和歉意。

最佳答案

解决您的第一个问题:这是使用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)

关于r - dplyr和 Shiny 的非标准评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30495394/

10-12 19:16