在 R shiny 中索引一个变量两次
Indexing a variable twice in R shiny
我正在尝试对我的 Shiny 应用程序进行一些集成测试,但我不知道我做错了什么。我怀疑这与我在尝试访问 likelihood、color 和 riskMessage 变量时两次使用“$”有关。
我一直 运行 进入这个错误:
Error in checkEqualsNumeric(output$coloredBox$likelihoodOfHarm, 0.75) :
Modes: NULL, numeric
Lengths: 0, 1
target is NULL, current is numeric
这是我的 Shiny 应用程序代码,我尝试在底部测试 Shiny 应用程序。非常感谢任何帮助!
displayColoredBox<- function(color, riskMessage){
sidebarPanel(style=sprintf("background-color: %s; width: 300px; height: 300px;", color),
h3(sprintf("%s", riskMessage)) ) }
app <- shinyApp(
ui = fluidPage(
div(
id = "form",
sliderInput("count1", "First Slider Input", value=0, min=0, max=5000),
sliderInput("count2", "Second Slider Input", value=0, min=0, max=5000),
uiOutput("coloredBox")
)),
server <- function(input, output, session) {
output$coloredBox<-renderUI({
req(input$count1)
req(input$count2)
count1 <- input$count1;
count2 <- input$count2;
likelihood <- (count1*count2)/5000000
if (likelihood>1) {
color="red"
riskMessage="Extreme risk!"
} else if (likelihood>.65){
color="orange"
riskMessage="Very high risk!"
}
else if (likelihood>.35){
color="yellow"
riskMessage="High risk!"
}
else if (likelihood>.10){
color="blue"
riskMessage="Moderate risk!"
} else {
color="green"
riskMessage="Low risk!"
}
coloredBox=displayColoredBox(color, riskMessage)
})
}
)
testServer(app, {
session$setInputs(count1 = 1500)
session$setInputs(count2 = 2500)
checkEqualsNumeric(output$coloredBox$likelihood, 0.75)
checkEquals(output$coloredBox$riskMessage, "Very high risk!")
checkEquals(output$coloredBox$color, "orange")
})
output
Shiny Apps 中的对象不是您可以按照您尝试的方式访问的列表。相反,它们是 HTML 个对象。 shiny-way 将如下所示:将您的值存储为根据输入而变化的反应。检查反应物是否具有所需的值。
displayColoredBox<- function(color, riskMessage){
sidebarPanel(style=sprintf("background-color: %s; width: 300px; height: 300px;", color),
h3(sprintf("%s", riskMessage)) ) }
library(RUnit)
app <- shinyApp(
ui = fluidPage(
div(
id = "form",
sliderInput("count1", "First Slider Input", value=0, min=0, max=5000),
sliderInput("count2", "Second Slider Input", value=0, min=0, max=5000),
uiOutput("coloredBox")
)),
server <- function(input, output, session) {
likelihood <- reactive((input$count1*input$count2)/5000000)
boxValues <- reactiveValues(color="", riskMessage="")
observe({
req(input$count1)
req(input$count2)
if (likelihood()>1) {
boxValues$color="red"
boxValues$riskMessage="Extreme risk!"
} else if (likelihood()>.65){
boxValues$color="orange"
boxValues$riskMessage="Very high risk!"
}
else if (likelihood()>.35){
boxValues$color="yellow"
boxValues$riskMessage="High risk!"
}
else if (likelihood()>.10){
boxValues$color="blue"
boxValues$riskMessage="Moderate risk!"
} else {
boxValues$color="green"
boxValues$riskMessage="Low risk!"
}
})
output$coloredBox<-renderUI({
displayColoredBox(boxValues$color, boxValues$riskMessage)
})
}
)
testServer(app, {
session$setInputs(count1 = 1500)
session$setInputs(count2 = 2500)
checkEquals(likelihood(), 0.75)
checkEquals(boxValues$riskMessage, "Very high risk!")
checkEquals(boxValues$color, "orange")
})
我正在尝试对我的 Shiny 应用程序进行一些集成测试,但我不知道我做错了什么。我怀疑这与我在尝试访问 likelihood、color 和 riskMessage 变量时两次使用“$”有关。 我一直 运行 进入这个错误:
Error in checkEqualsNumeric(output$coloredBox$likelihoodOfHarm, 0.75) :
Modes: NULL, numeric
Lengths: 0, 1
target is NULL, current is numeric
这是我的 Shiny 应用程序代码,我尝试在底部测试 Shiny 应用程序。非常感谢任何帮助!
displayColoredBox<- function(color, riskMessage){
sidebarPanel(style=sprintf("background-color: %s; width: 300px; height: 300px;", color),
h3(sprintf("%s", riskMessage)) ) }
app <- shinyApp(
ui = fluidPage(
div(
id = "form",
sliderInput("count1", "First Slider Input", value=0, min=0, max=5000),
sliderInput("count2", "Second Slider Input", value=0, min=0, max=5000),
uiOutput("coloredBox")
)),
server <- function(input, output, session) {
output$coloredBox<-renderUI({
req(input$count1)
req(input$count2)
count1 <- input$count1;
count2 <- input$count2;
likelihood <- (count1*count2)/5000000
if (likelihood>1) {
color="red"
riskMessage="Extreme risk!"
} else if (likelihood>.65){
color="orange"
riskMessage="Very high risk!"
}
else if (likelihood>.35){
color="yellow"
riskMessage="High risk!"
}
else if (likelihood>.10){
color="blue"
riskMessage="Moderate risk!"
} else {
color="green"
riskMessage="Low risk!"
}
coloredBox=displayColoredBox(color, riskMessage)
})
}
)
testServer(app, {
session$setInputs(count1 = 1500)
session$setInputs(count2 = 2500)
checkEqualsNumeric(output$coloredBox$likelihood, 0.75)
checkEquals(output$coloredBox$riskMessage, "Very high risk!")
checkEquals(output$coloredBox$color, "orange")
})
output
Shiny Apps 中的对象不是您可以按照您尝试的方式访问的列表。相反,它们是 HTML 个对象。 shiny-way 将如下所示:将您的值存储为根据输入而变化的反应。检查反应物是否具有所需的值。
displayColoredBox<- function(color, riskMessage){
sidebarPanel(style=sprintf("background-color: %s; width: 300px; height: 300px;", color),
h3(sprintf("%s", riskMessage)) ) }
library(RUnit)
app <- shinyApp(
ui = fluidPage(
div(
id = "form",
sliderInput("count1", "First Slider Input", value=0, min=0, max=5000),
sliderInput("count2", "Second Slider Input", value=0, min=0, max=5000),
uiOutput("coloredBox")
)),
server <- function(input, output, session) {
likelihood <- reactive((input$count1*input$count2)/5000000)
boxValues <- reactiveValues(color="", riskMessage="")
observe({
req(input$count1)
req(input$count2)
if (likelihood()>1) {
boxValues$color="red"
boxValues$riskMessage="Extreme risk!"
} else if (likelihood()>.65){
boxValues$color="orange"
boxValues$riskMessage="Very high risk!"
}
else if (likelihood()>.35){
boxValues$color="yellow"
boxValues$riskMessage="High risk!"
}
else if (likelihood()>.10){
boxValues$color="blue"
boxValues$riskMessage="Moderate risk!"
} else {
boxValues$color="green"
boxValues$riskMessage="Low risk!"
}
})
output$coloredBox<-renderUI({
displayColoredBox(boxValues$color, boxValues$riskMessage)
})
}
)
testServer(app, {
session$setInputs(count1 = 1500)
session$setInputs(count2 = 2500)
checkEquals(likelihood(), 0.75)
checkEquals(boxValues$riskMessage, "Very high risk!")
checkEquals(boxValues$color, "orange")
})