【问题标题】:Non-standard evaluation with dplyr and shinydplyr 和 shiny 的非标准评估
【发布时间】:2015-05-28 00:41:25
【问题描述】:

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

我在下面包含了一个示例,其中有两行注释行,这些行是我希望开始工作的。第一个注释行旨在从输出表中删除由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)
  })
}
)

如果这个问题在别处得到解答,非常感谢您的帮助和道歉。

【问题讨论】:

  • 对第一条评论的简单修复是使用get -- select(-get(input$var_to_drop))
  • 谢谢杰森。你是对的。我曾尝试gettop_n 失败并放弃了它,但它适用于select。我还尝试将top_n 的使用替换为filter_(min_rank(desc(input$var_to_rank)) &lt;= input$n.obs),但这也不起作用。也没有与get 一起采用这种方法。

标签: r shiny dplyr


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。使用 tail 是一种巧妙的解决方法,但在我的用例中,不幸的是,我需要在输出中保留并列排名。正如您所说,这意味着将返回更多行。
  • 查看我编辑的答案,我修改了我的解决方案以使用 NSE 模仿 top_n。虽然不是最干净的,你可以细化它
  • 太棒了。非常感谢你。这解决了问题。其他人的注意事项缺少“=”符号。更正后的行是 select_(lazyeval::interp(~ -var, var = as.name(input$var_to_drop)))。我还修改为在第一次按物种过滤后而不是事先计算截止值,使用 mutate 将截止值添加到 iris 数据帧,然后应用截止滤波器。再次感谢。
  • 对不起,编辑了我的答案以修正那个错字。
猜你喜欢
  • 1970-01-01
  • 2020-09-17
  • 2017-10-27
  • 2019-03-23
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多