在闪亮的应用程序中使用 quote() 和 substitute() 作为条件

Using quote() and substitute() for conditions within a shiny app

我正在尝试使用 quote/substitute 作为在 shiny 中应用条件的方法。我对 quote/substitute 或 shiny 都不是很熟悉 - 所以我绝对有可能没有以正确的方式解决这个问题。

我在下面创建了一个简单示例来说明我遇到的问题。

#Create test dataframe
test<-data.frame(x=c(0:10), y=c(rep(1,5),rep(2,6)), z=c("A","A","A","B","B","B","C","C","C","C","C"))

#example of what I would like to do outside shiny app 
test[test$x > 5,]

#or using quote and eval 
test[eval(quote(test$x > 5)),]

以上所有代码都有效。但是现在假设我想在一个闪亮的应用程序中应用它(并允许用户选择条件):

#create simple shiny app
require(shiny)


# Server
server <- function(input, output) {


  # subset of nodes
    df <- reactive({

        #eliminate certain observations 
        x <- test[eval(input$condition),]

    })

    output$table <- renderTable({
        df <- df()


    })


}



# UI 
ui <- fluidPage(

radioButtons("conditon", "Condition", choices = c("cond_1" = substitute(test$x > 5), "cond_2" = substitute(test$x<5))),

tableOutput("table")


)


# Create app 
shinyApp(ui = ui, server = server)

但这会给出错误 "All sub-lists in "choices" must be names")。我不确定如何解释这一点,所以被困住了。我查看了 Shiny - All sub-lists in "choices" must be named? 中的答案,但没有发现它们有帮助。

希望有解决此问题的方法或更好方法的建议(但请注意,我无法提前创建子集,因为对于我更复杂的实际示例,这会产生问题)。

一个 quick 修复可能是用 deparse 换行然后使用 eval(parse。尚不完全清楚为什么输入需要是表达式。如果这只是为了子集化,有更简单的方法来完成同样的事情

library(shiny)

-ui

ui <- fluidPage(
  radioButtons("conditon", "Condition", 
                  choices = list(cond_1 = deparse(substitute(test$x > 5)),
                                 cond_2 = deparse(substitute(test$x<5))),
            selected = deparse(substitute(test$x > 5)) ),

   tableOutput("table")

  )

-服务器

server <- function(input, output) {

  # subset of nodes
  df <- reactive({

    #eliminate certain observations 
     test[eval(parse(text=input$conditon)),, drop = FALSE]


  })

  output$table <- renderTable({
     df()


  })


}

-创建应用程序

shinyApp(ui = ui, server = server)

-输出