gpt4 book ai didi

r - 将用户规范作为参数传递给 Shiny 中的 dplyr

转载 作者:行者123 更新时间:2023-12-02 01:15:10 24 4
gpt4 key购买 nike

我正在编写一个新的 Shiny 应用程序,我想通过使用 dplyr 命令进行数据操作来留在 Hadleyverse 中。我希望 Shiny 打印一个表格,根据用户可以选择的变量仅显示前 3 个观察结果。例如,一个用户可能希望查看获得的奖励数量排名前 3 的员工,而另一个用户可能希望查看获得的奖励积分数量排名前 3 的员工。

在我最近的尝试中,我有这个 ui.R:

library(shiny)
shinyUI(fluidPage(
verticalLayout(
tableOutput("tbl"),
selectInput("top3", label = h4("Quantity"),
choices = list("Number of awards" = "NumberOfAwards",
"Total points awarded" = "TotalAwarded")),
tableOutput("t3")
)))

这适用于服务器。R:

library(dplyr)
library(shiny)
shinyServer(function(input, output) {
employeestats <- read.table(header=TRUE, text='
Employee NumberOfAwards TotalAwarded
Al 3 10
Betty 6 20
Chuck 2 5
Donna 4 15
Ed 0 0
')
output$tbl <- renderTable({
employeestats
},include.rownames=TRUE)
datasetInput <- reactive({employeestats})
output$t3 <- renderTable({
head(datasetInput() %>% arrange(desc(input$top3)),n=3)
},include.rownames=TRUE)
})

在 Shiny 之外,命令

head(employeestats %>% arrange(desc(NumberOfAwards)),n=3)

给出了我想要的前 3 名获奖者的答案。在 Shiny 中,打印完整表格和选择框,但没有显示前 3 个表格,并且我收到消息“eval(substitute(expr), envir, enclos) 中的错误:无法排列类 'NULL' 的列”。我知道这与 Shiny 和 dplyr 使用非标准函数有关,并且如果 R 看到 NumberOfAwards 或字符串“NumberOfAwards”,可能会产生影响。我尝试过诸如 deparse(substitute())、使用数字来指示要排列的列等,但没有成功。这不必很复杂;例如,我不关心第三名的平局。

有什么想法吗?感谢您的帮助。

最佳答案

问题是 arrange() 函数需要您的参数作为 symbol。但是,您的 input$top3 是一个字符串。

诀窍是:

output$t3 <- renderTable({ 
sorted_stats <- eval(substitute(employeestats %>% arrange(desc(col)),
list(col=as.symbol(input$top3))))
head(sorted_stats,n=3)
},include.rownames=TRUE)

您可以使用?substitute来查看它是如何工作的。

简短版本,它解析表达式:

employeestats %>% arrange(desc(col))

进入由call(函数)和name(符号、常量、对象)组成的解析树,允许我们替换组件以形成新的表达方式。

到目前为止,表达式尚未计算(这意味着 employeestats 尚未排列)。

这里的col实际上没有任何意义。它只是充当占位符。通过将 list(col=as.symbol(input$top3)) 传递给 substitute,我们将虚拟符号 col 替换为实际符号我们希望按 as.symbol(input$top3) 进行排列。根据当前输入,这可能是 TotalAwardedNumberOfAwards(符号,不再是字符串)。

最后,eval() 函数计算表达式(用实际符号替换 col),并返回排序后的 data.frame.

关于r - 将用户规范作为参数传递给 Shiny 中的 dplyr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com