Shining server中变量的查询和操作
我将继续尝试了解shiny的基本知识。我现在试图通过文本框(Shining server中变量的查询和操作,r,shiny,R,Shiny,我将继续尝试了解shiny的基本知识。我现在试图通过文本框(input$answer)获取用户输入,基于该输入进行条件测试(input$answer==“xyz”),并基于该条件生成输出(if{}else{}) 我想我记下了很多基础知识。我可以得到一个用户输入,我已经把它转换成一个反应值,这样我就可以在if语句中生成一个查询,而不会出现错误。在提交答案后,我可以使用用户输入生成输出 但有两个问题: 查询(隔离(输入$answer)=“Hello”)永远不会为真,因为isolare(输入$answ
input$answer
)获取用户输入,基于该输入进行条件测试(input$answer==“xyz”
),并基于该条件生成输出(if{}else{}
)
我想我记下了很多基础知识。我可以得到一个用户输入,我已经把它转换成一个反应值,这样我就可以在if语句中生成一个查询,而不会出现错误。在提交答案后,我可以使用用户输入生成输出
但有两个问题:
(隔离(输入$answer)=“Hello”)
永远不会为真,因为isolare(输入$answer)
的值始终保持其第一次分配的值。在当前的情况下是“输入文本…”,但如果我将此项留空,行为不会改变(它只是假定“”为值)。如果我将语句更改为If(隔离(输入$answer)=“输入文本…”)
则计算结果将始终为真。为什么即使在后续的paste0(“您的答案”,输入$answer,“不正确!”)}
中正确更新了该值,该值也不会更改库(闪亮)
#//定义游戏的用户界面----
ui当你从普通的R移动到闪亮的R时,你需要把你的逻辑从里到外一点。您希望是被动的一切(即响应用户输入的更改)都需要在被动上下文中(例如renderText
)
在本例中,加载应用程序时,if
语句实际上只执行一次。要使其更符合您的需要,请尝试以下方法:
output$evaluation <- renderText({
if (input$answer == "Hello") {
#// correct counter up by one
correct <- correct + 1
counter <- counter + 1
paste0("Your answer of `",input$answer, "` is correct!")
} #// end if
else {
#// answer is not correct
counter <- counter + 1
paste0("Your answer of `",input$answer, "` is incorrect!")
} #// end else
})
output$evaluation当您从正常的R移动到闪亮的R时,您需要将您的逻辑从内到外一点。您希望是被动的一切(即响应用户输入的更改)都需要在被动上下文中(例如renderText
)
在本例中,加载应用程序时,if
语句实际上只执行一次。要使其更符合您的需要,请尝试以下方法:
output$evaluation <- renderText({
if (input$answer == "Hello") {
#// correct counter up by one
correct <- correct + 1
counter <- counter + 1
paste0("Your answer of `",input$answer, "` is correct!")
} #// end if
else {
#// answer is not correct
counter <- counter + 1
paste0("Your answer of `",input$answer, "` is incorrect!")
} #// end else
})
output$evaluation您的主要问题是,您试图在被动上下文之外的值上执行逻辑比较。在比较环境中,input$answer
从未更改
另外,answer您的主要问题是,您试图在被动上下文之外的值上执行逻辑比较。在比较环境中,input$answer
从未更改
另外,回答得很好。非常感谢。我想我现在看到了如何定义变量并使用它们。如果变量仅在服务器端使用,则可以照常使用。如果它们需要在UI和服务器之间穿梭,则必须将它们定义为反应式,然后可以通过命令中的名称$xyz调用进行寻址。如果要在其他函数(如If)中使用它们,则需要使用isolate调用它们。最后,将所有内容包装在`observeEvent(input$answer)`中,每次提交新答案时,整个位只执行一次。太好了。非常感谢。我想我现在看到了如何定义变量并使用它们。如果变量仅在服务器端使用,则可以照常使用。如果它们需要在UI和服务器之间穿梭,则必须将它们定义为反应式,然后可以通过命令中的名称$xyz调用进行寻址。如果要在其他函数(如If)中使用它们,则需要使用isolate调用它们。最后,将所有内容包装在`observeEvent(input$answer)`中,每次提交新答案时,整个位只执行一次。谢谢!占位符=“输入文本…”
正是我认为它应该做的。这也解释了为什么有“价值”会把一切都搞砸。谢谢!占位符=“输入文本…”
正是我认为它应该做的。这也解释了为什么有“价值”会把一切都搞砸。
library(shiny)
#// Define UI for game ----
ui <- fluidPage(
#// for query
fluidRow (
#// column width and title
column(6, h3("Question"),
h4("Type the word `Hello`"),
#// Input: Text Box
textInput("answer", h3("Text input"),
placeholder = "Enter text..."),
#// submit button to terminate the text input
submitButton("Submit")
), #// end column
#// column width and title
column(6, h3("Evaluation"),
#// Output: Text ----
textOutput(outputId = "evaluation"),
br(),
textOutput(outputId = "trials")
) #// end column
) #// end fluidrow
) # end fluidpage
# Define server logic ----
server <- function(input, output) {
#// set up variables
values <- reactiveValues()
values$counter <- -1
values$correct <- 0
num <- 10
#// logic for correct vs. incorrect
observeEvent(input$answer,{
if (isolate(input$answer) == "Hello") {
#// correct counter up by one
values$correct <- values$correct + 1
#// answer is correct
output$evaluation <- renderText({
paste0("Your answer of `",input$answer, "` is correct!") })
} #// end if
else {
#// answer is not correct
output$evaluation <- renderText({
paste0("Your answer of `",input$answer, "` is incorrect!") })
} #// end else
values$counter <- values$counter + 1
output$trials <- renderText({paste0("Trials: ",values$counter," Correct: ",values$correct)})
#// stop app if count reaches number of games
if (values$counter >= num) stopApp()
})
} #// end server
# Run the app ----
shinyApp(ui = ui, server = server)