使用 dplyr 和 shiny 进行非标准评估
Non-standard evaluation with dplyr and shiny
我希望有人可以在闪亮的应用程序中将变量名传递给 dplyr 时帮助我进行非标准评估。我的意图是能够将 select 变量传递给函数 select
和 top_n
。我知道 select
函数对 NSE 有等效的 select_
,但我也在努力让它在闪亮的应用程序中工作。
我在下面包含了一个示例,其中有两条注释行是我希望开始工作的。第一个注释行旨在从输出 table 中删除由 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)))
可能有 easier/shorter 方法,但这行得通。我知道如果您想包含而不是删除列,它会简单得多,我无法找出与 -
一起使用的更短代码
对于你的第二个问题,你可以像这样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)
可能 return 超过 5 行,所以我正在做类似的事情但确保只有 5 行得到 returned
iris %>% arrange_(input$var_to_rank) %>% tail(input$n.obs)
我希望有人可以在闪亮的应用程序中将变量名传递给 dplyr 时帮助我进行非标准评估。我的意图是能够将 select 变量传递给函数 select
和 top_n
。我知道 select
函数对 NSE 有等效的 select_
,但我也在努力让它在闪亮的应用程序中工作。
我在下面包含了一个示例,其中有两条注释行是我希望开始工作的。第一个注释行旨在从输出 table 中删除由 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)))
可能有 easier/shorter 方法,但这行得通。我知道如果您想包含而不是删除列,它会简单得多,我无法找出与 -
对于你的第二个问题,你可以像这样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)
可能 return 超过 5 行,所以我正在做类似的事情但确保只有 5 行得到 returned
iris %>% arrange_(input$var_to_rank) %>% tail(input$n.obs)