2014-09-01 3 views
-1

У меня есть блестящий server.R, который пытается сделать следующее:Блестящие и условные операторы

У меня есть selectInput на боковой панели, что позволяет пользователю выбрать один из 2-х условий, которые впоследствии изменения пользовательского интерфейса, который состоит из условных панелей, по одному для каждого условия.

Мой server.R устанавливается следующим образом:

if (input$option1) {return()} 
else{run code corresponding to option 2 which outputs reactive variable 2} 

if (input$option2) {return()} 
else{run code corresponding to option 1 which outputs reactive variable 1} 
. 
. 
. 
run another function that depends on variable 1 or variable 2, depending on which input is chosen above 

Причина выше код не работает, потому что для того, чтобы сослаться на вход $ опционного *, я должен быть реактива Окружающая среда. Но ясно, что я не могу поместить его в вызов isolate(), потому что мне нужно, чтобы пользовательский интерфейс отвечал на ввод пользователя. И ясно, что я не могу поместить его в вызов observ(), потому что мне нужно иметь возможность выводить переменную 1 или переменную 2 в зависимости от условной логики. Итак, как мне добиться того, чего я пытаюсь достичь? Я могу предоставить свой код, если это необходимо, но я думаю, что это скорее проблема дизайна/программы.

Спасибо. Код ниже:

runApp(list(
    ui = fluidPage(
    headerPanel("App"), 

    sidebarPanel(
     selectInput(
     "simtype", 
     "Select Simulation Type", 
     c(SingleSubject = "SS", FromFile = "FF"), 
     selected = "FF", 
     multiple = FALSE 
    ), 
     conditionalPanel(
     condition = "input.simtype=='FF' ", 
     fileInput(
      'file1', 
      'Upload File Here', 
      accept = c('text/csv', 'text/comma-separated-values,text/plain', '.csv') 
     ), 
     # tags$hr(), 
     checkboxInput('header', 'Header', TRUE), 
     radioButtons(
      'sep', 
      'Separator', 
      c(
      Comma = ',', 
      Semicolon = ';', 
      Tab = '\t' 
     ), 
      'Comma' 
     ), 
     uiOutput('varselect1') 
    ), 

     conditionalPanel(
     condition = "input.simtype== 'SS' ", 
     aceEditor(
      "text", 
      "", 
      mode = "r", 
      theme = "twilight", 
      height = "40px", 
      fontSize = 10 
     ), 
     uiOutput('varselect2') 
    ) 
    ), 
    mainPanel(#uiOutput('tabs') 
     tabsetPanel(
     tabPanel(title = 'FILE', value = "filetab", tableOutput("filetable")), 
     tabPanel(
      title = "SUMMARY", 
      value = "summarytab", 
      dataTableOutput("summarytable") 
     ), 
     id = "tabs" 
    )) 
), 

    server = function(input, output) { 
    if (input$simtype == "SS") { 
     return() 
    } else{ 
     file <- reactive({ 
     file <- input$file1 
     }) 
     output$filetable <- renderTable({ 
     file() 
     }) 

    } #end if 
    output$varselect1 <- renderUI({ 
     if (is.null(input$file1$datapath)) { 
     return() 
     } 

     list(actionButton("goButton", 'GO'), 
      numericInput("s1", "Input value 1", NULL)) 

    }) # end renderUI() 

    if (input$simtype == "FF") { 
     return() 
    } else{ 
     get.text <- reactive({ 
     input$text 
     }) 
     output$filetable <- renderTable({ 
     X <- read.table(text = get.text()) 
     X 
     }) # end renderTable() 

    } #end if 
    output$varselect2 <- renderUI({ 
     if (input$text == "") { 
     return() 
     } 

     list(numericInput("s0", "Input value", NULL), 
      actionButton("goButton", 'GO')) 

    }) 
    #end renderUI() 
    mydata <- reactive({ 
     input$goButton 
     if (input$simtype == "FF") { 
     variable = file() 
     } else { 
     variable = X() 
     } 
    }) #end mydata() 
    output$summarytable <- renderDataTable({ 
     variable 
    }) 
    } 
)) 
+0

Непонятно, где именно у вас есть этот код или что вы ожидаете от него. Было бы неплохо, если бы вы могли создать минимальный воспроизводимый пример, который может запускаться, чтобы точно увидеть, что вы делаете, и проверить возможные решения/альтернативы. (В идеале вызов 'runApp' со списком для функций' ui = 'и' server = ', как внизу справочной страницы'? RunApp'.) – MrFlick

+0

Хорошо, я могу это сделать. – yahooligan8

+0

Кажется, есть много синтаксических ошибок, если я пытаюсь скопировать/вставить это в R, чтобы он не был запущен. Также у вас возникла проблема с синтаксисом 'if/else'. Если ваш оператор if выполняет блок ('{..}'), 'else', но начинается с той же строки, что и закрывающая'} '. Он не может начинаться с новой строки. В противном случае это может быть неоднозначно относительно того, где принадлежит другое. – MrFlick

ответ

2

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

library(shiny) 
library(shinyAce) 
runApp(list(
    ui = fluidPage(
    headerPanel("App"), 
    sidebarPanel(
     selectInput("simtype", "Select Simulation Type", list(SingleSubject="SS", FromFile="FF"), selected="SS", multiple=FALSE), 

     conditionalPanel(condition="input.simtype=='FF' ", 
     fileInput('file1', 'Upload File Here', accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv')), 
     checkboxInput('header', 'Header', TRUE), 
     radioButtons('sep', 'Separator', c(Comma=',', Semicolon=';', Tab='\t'),',') #change 'Comma' to ',' 

    ), 
     conditionalPanel(condition="input.simtype== 'SS' ", 
     aceEditor("text", "", mode="r", theme="twilight", height="40px",fontSize = 10) 
    ), 
     uiOutput('varselect') 
    ), 
    mainPanel(
     tabsetPanel(
     tabPanel(title='FILE', value="filetab", tableOutput("filetable")), 
     tabPanel(title="SUMMARY", value="summarytab", dataTableOutput("summarytable")), 
     id="tabs") 
    ) 
    ), 
    server = function(input, output) { 

    userdata <- reactive({ 
     x<-if(input$simtype=="SS" && input$text != "") { 
     read.table(text=input$text) 
     } else if (input$simtype=="FF" && !is.null(input$file1$datapath)) { 
     read.table(input$file1$datapath) 
     } else { 
     data.frame() 
     } 
     x 
    }) 

    output$varselect <- renderUI({ 
     if(nrow(userdata())>0){list()} 
     list(
     numericInput("s1", "Input value 1", NULL), 
     actionButton("goButton",'GO') 
    ) 
    }) # end renderUI() 

    currentdata <- reactive({ 
     input$goButton   
     isolate(userdata()) 
    }) 

    output$filetable <- renderTable({ 
     currentdata() 
    }) 

    output$summarytable<- renderDataTable({ 
     currentdata() 
    }) 

    } #end server 
)) 
+0

Я попытался проясниться выше. У меня две реактивные панели, которые меняются в зависимости от пользовательского ввода.Если пользователь вводит выбор A, появляется одна панель, и они вводят данные. Если пользователь вводит выбор B, другая панель appaears, и они вводят данные. Затем эти данные передаются другой функции независимо от выбранного параметра. Но как эти данные смотрят DEPENDS на какой вариант был выбран. В первом случае данные поступают из файла. Во втором случае данные вводятся пользователем MANUALLY. Я просто пытаюсь получить его так, чтобы независимо от ввода данных программа могла его проанализировать. – yahooligan8

+0

Так сделал ли мой образец это или я что-то пропустил? – MrFlick

+0

Ваш код не работает. – yahooligan8

Смежные вопросы