Select 动态数据帧子集

Select dynamically a dataframe subset

我遇到了问题,无法通过下拉菜单中选择的列对数据框进行动态子集化。基本上,我想让用户决定哪一个将成为 y 轴上的列。

文件global.R:

library(shiny)
library(plotly)

# Cars
data("USArrests")
USArrests$state <- row.names(USArrests)

文件ui.R:

ui <- fluidPage(
    fluidRow(
        selectInput(inputId = "select_col",
                    label = tags$h4("Select Column"),
                    choices = c("Murder", "Assault", "UrbanPop", "Rape"),
                    selected = "Murder"
        ),
        plotlyOutput("plot")
    )
)

文件server.R:

server <- function(input, output) {
    output$plot <- renderPlotly({
        plot_ly(USArrests, 
                x = ~state,
                y = ~input$select_col, # this works but is not reactive y = ~Murder
                type = 'bar')
        
    })   
}

最后一个文件是我遇到的问题。它不接受 select_col 下拉菜单中的值作为有效输入 (y = ~input$select_col ).

错误的解决方案:

我想出了这个解决方案,但我不喜欢它。它太冗长了。有更高效的方法吗?

更正 server.R:

server <- function(input, output) {
    output$plot <- renderPlotly({
        df <- USArrests[c('state', input$select_col)]
        names(df) <- c('state', 'to_y')
        plot_ly(df, 
                x = ~state,
                y = ~to_y, 
                type = 'bar')
        
    })   
}

一个选项是以编程方式生成公式:

server <- function(input, output) {
    output$plot <- renderPlotly({
        plot_ly(USArrests, 
                x = ~state,
                y = formula(paste("~", input$select_col)),
                type = 'bar')
        
    })   
}