используя еще, если в блестящем приложении R - PullRequest
0 голосов
/ 15 мая 2018

У меня есть простое блестящее приложение для расчета размера выборки, которое я пытаюсь создать, но я не могу понять.

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

   ui <- shinyUI(fluidPage(
  titlePanel("alpha version of sample size calculator"),

  sidebarPanel(
    numericInput(
      "expn",
      "Please enter total number of reports received",
      1,
      min = 0,
      max = 1000000
    ),
    radioButtons(
      inputId = "'QC_Type'",
      label = "QC Type",
      choices = c(
        "Overall" = "a",
        "Solicited" ="b",
        "Spontaneous" = "c",
        "Clinical Trial"="d",
        "Literature"= "e"
      ) 
    )
  ),
  mainPanel (
    p ("Your required sample size is"),
    textOutput("results"))
))

server <- function (input, output) {
  A1 <- (1.96*1.96)*(0.3)*(1-0.3)/(0.05*0.05)
  B1 <- (1.96*1.96)*(0.32)*(1-0.32)/(0.05*0.05)
  C1 <-  (1.96*1.96)*(0.35)*(1-0.35)/(0.05*0.05)
  D1 <-  (1.96*1.96)*(0.26)*(1-0.26)/(0.05*0.05)
  E1 <-  (1.96*1.96)*(0.36)*(1-0.36)/(0.05*0.05)
  options(digits=2)
  if (input$QC_Type=="a") {
    output$results <- renderText({
      as.numeric( (input$expn)*(A1)/(input$expn+(A1)+1))
    })
  } else if (input$QC_Type=="b") {
    output$results <- renderText({
      as.numeric( (input$expn)*(B1)/(input$expn+(B1)+1))
    })
  } else if (input$QC_Type=="c") {
    output$results <- renderText({
      as.numeric( (input$expn)*(C1)/(input$expn+(C1)+1))
    })
  } else if (input$QC_Type=="d") {
    output$results <- renderText({
      as.numeric( (input$expn)*(D1)/(input$expn+(D1)+1))
    })
  } else if (input$QC_Type=="e") {
    output$results <- renderText({
      as.numeric( (input$expn)*(E1)/(input$expn+(E1)+1))
    })
  }
}

Это, однако, не запускается и выдает сообщение об ошибке с указанием реактивных элементов.

Обновление:

Спасибо за ответы, сообщество R невероятно :) - Я действительно посмотрел предложенный поток, хотя я действительно заметил сходство, которое мой код пытается выполнить вычисление, основанное на числовом вводе и переключателе. Я попробовал следующее, включив логику в функции рендеринга:

       server <- function (input, output) {
  options(digits=2)
  output$results <- renderText({
    x <- reactive({input$QC_Type})
    A1 <- (1.96*1.96)*(0.3)*(1-0.3)/(0.05*0.05)
    B1 <- (1.96*1.96)*(0.32)*(1-0.32)/(0.05*0.05)
    C1 <- (1.96*1.96)*(0.35)*(1-0.35)/(0.05*0.05)
    D1 <- (1.96*1.96)*(0.26)*(1-0.26)/(0.05*0.05)
    E1 <- (1.96*1.96)*(0.36)*(1-0.36)/(0.05*0.05)
     if (x()=="a") {  
      as.numeric( (input$expn)*(A1)/(input$expn+(A1)+1))
    } else if (x()=="b") {  
      as.numeric( (input$expn)*(B1)/(input$expn+(B1)+1))
    } else if (x()=="c") {  
      as.numeric( (input$expn)*(C1)/(input$expn+(C1)+1))
    } else if (x()=="d") {  
      as.numeric( (input$expn)*(D1)/(input$expn+(D1)+1))
    } else if (x()=="e") {  
      as.numeric( (input$expn)*(E1)/(input$expn+(E1)+1))
    }

  }

  )
}

Приложение работает, но в основной панели вывода я получаю сообщение о том, что аргумент имеет длину 0, а не требуемый расчет.

Обновление 2

После некоторого дальнейшего изучения я понял, что «нулевая длина» была из-за отсутствующего компонента в синтаксисе (req input). Мой код в настоящее время выглядит следующим образом, однако в настоящее время нет выходных данных - любые дальнейшие указания будут чрезвычайно полезны.

library(shiny)
ui <- shinyUI(fluidPage(
  titlePanel("alpha version of sample size calculator"),

  sidebarPanel(
    numericInput(
      "expn",
      "Please enter total number of reports received",
      1,
      min = 0,
      max = 1000000
    ),
    radioButtons(
      inputId = "'QC_Type'",
      label = "QC Type",
      choices = c(
        "Overall" = 1,
        "Solicited" =2,
        "Spontaneous" = 3,
        "Clinical Trial"=4,
        "Literature"= 5
      ) 
    )
  ),
  mainPanel (
    p ("Your required sample size is"),
    textOutput("results"))
))



## server attempt 5 
server <- function (input, output,session) {
  options(digits=2)
  A1 <- (1.96*1.96)*(0.3)*(1-0.3)/(0.05*0.05)
  B1 <- (1.96*1.96)*(0.32)*(1-0.32)/(0.05*0.05)
  C1 <- (1.96*1.96)*(0.35)*(1-0.35)/(0.05*0.05)
  D1 <- (1.96*1.96)*(0.26)*(1-0.26)/(0.05*0.05)
  E1 <- (1.96*1.96)*(0.36)*(1-0.36)/(0.05*0.05)
  output$results <- renderText({
    x <- reactive({input$QC_Type}) 
    req(input$QC_Type)
    req(input$expn)
     if (x()==1) {  
     as.character( (input$expn)*(A1)/(input$expn+(A1)+1))
    } else if (x()==2) {  
      as.character( (input$expn)*(B1)/(input$expn+(B1)+1))
    } else if (x()==3) {  
      as.character( (input$expn)*(C1)/(input$expn+(C1)+1))
    } else if (x()==4) {  
      as.character( (input$expn)*(D1)/(input$expn+(D1)+1))
    } else if (x()==5) {  
      as.character( (input$expn)*(E1)/(input$expn+(E1)+1))
    } 

    }


  )
}
shinyApp(ui = ui, server= server)

1 Ответ

0 голосов
/ 15 мая 2018

Ваша проблема на самом деле очень проста: посмотрите на inputId для вашего radioButtons:

radioButtons(
  inputId = "'QC_Type'",
  label = "QC Type",
  choices = c(
    "Overall" = 1,
    "Solicited" =2,
    "Spontaneous" = 3,
    "Clinical Trial"=4,
    "Literature"= 5
  ) 
)

Просто удалите дополнительный набор кавычек вокруг QC_Type, и он будет работать нормально.

Также: когда Шини говорит о реактивном выражении, это не просто означает reactive.Все, что имеет reactive, observe или render в имени, будет учитываться.Поэтому в этой строке нет необходимости:

x <- reactive({input$QC_Type})

Поскольку вы уже находитесь внутри реактивного выражения (renderText), вы можете удалить эту строку и использовать input$QC_Type везде, где у вас есть x()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...