У меня есть простое блестящее приложение для расчета размера выборки, которое я пытаюсь создать, но я не могу понять.
входы состоят из 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)