Использование quote() и replace() для условий в блестящем приложении

Я пытаюсь использовать цитату/замену как метод применения условия в блестящем. Я не очень хорошо знаком ни с кавычками, ни с заменой, ни с блеском, поэтому вполне возможно, что я неправильно решаю эту проблему.

Я создал простой пример ниже, который иллюстрирует возникшую проблему.

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

Но это дает ошибку «Все подсписки в «выборах» должны быть именами»). Я не уверен, как это интерпретировать, и поэтому застрял. Я просмотрел ответы в Shiny - все подсписки в вариантах должны быть названы? но не нашли их полезными.

Был бы признателен за способ решить эту проблему или предложения по лучшему подходу (хотя обратите внимание, что я не могу создавать подмножества заранее, так как для моего более сложного фактического примера это создает проблемы).


person Robert.S    schedule 20.09.2017    source источник


Ответы (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 <- 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)

-выход

введите здесь описание изображения

введите здесь описание изображения

person akrun    schedule 20.09.2017
comment
Я точно скопировал ваш код и столкнулся с ошибкой недопустимого типа индекса «список». Любая идея, почему это работает для вас, но не для меня? - person Robert.S; 21.09.2017
comment
@Robert.S Я использую shiny_1.0.3, если это имеет значение - person akrun; 21.09.2017
comment
Я также используюshinin_1.0.3. - person Robert.S; 21.09.2017
comment
Пытаясь разобраться в этом, я получаю некоторые другие странные результаты. Например, я попытался добавить выбранный аргумент в переменную условия radioButtons: 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))), Но тогда я получаю ошибку Selected argument must be of length 1. Однако, когда я запускаю length(deparse(substitute(test$x > 5))), я получаю результат 1. - person Robert.S; 21.09.2017
comment
@Robert.S У меня все работает нормально, 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") ) - person akrun; 21.09.2017
comment
Я понял (вроде), в чем проблема. Для этого я нажимал кнопку «Запустить приложение» в верхней части R-студии, что приводило к ошибкам. Если я просто запускаю его напрямую, выбирая код и нажимая CTRL + ENTER, он работает. Любое понимание того, почему это так? В любом случае, спасибо за вашу помощь, я приму ваш ответ. - person Robert.S; 21.09.2017
comment
@Robert.S Не уверен, меняет ли его какая-либо разница в версии Rstudio. - person akrun; 21.09.2017