使用quote()和substitute()来表示闪亮应用中的条件

时间:2017-09-20 19:34:32

标签: r shiny conditional-statements subset quote

我试图使用quote / substitute作为一种方法来应用闪亮的条件。我对引用/替代或闪亮都不是很熟悉 - 所以我绝对不能以正确的方式解决这个问题。

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

#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)

但是这会给出错误&#34;&#34;选择&#34;中的所有子列表必须是名字&#34;)。我不确定如何解释这一点,所以卡住了。我查看了Shiny - All sub-lists in "choices" must be named?中的答案,但没有发现它们有用。

会很感激解决这个问题的方法,或者更好的方法的建议(虽然请注意我不能提前创建子集,因为我的更复杂的实际示例会产生问题)。

1 个答案:

答案 0 :(得分:1)

快速解决方法可能是使用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

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)

-output

enter image description here

enter image description here