基于R Shiny中的动态用户输入打印输出

时间:2017-10-09 16:58:13

标签: r shiny

我对R shine很新,因此无法找到本网站发布的类似问题的解决方案。我试图读取并使用用户提供给R shiny的输入来生成输出。

我正在尝试创建一个简单的GUI,用户选择一个人的名字(从下拉菜单中),然后输入他/她的体重。如果高度高于某个阈值,则输出建议为“#34;增益重量”,否则为“#34;松散重量”#34;

除了来自Server.R文件的以下错误外,一切似乎都运行良好:

 Error in `$.shinyoutput`(output, value_weight) : 
 Reading objects from shinyoutput object not allowed

如何阅读和使用变量' value_weight'在if-then-else条件下?

Main.R

library(shiny)
runApp()

Server.R

function(input, output) {

 # You can access the value of the widget with input$select, e.g.
 output$value_name   <- renderPrint({ input$select })
 output$value_weight <- renderPrint({ input$num })

 if(output$value_weight > 150)
 {
   output$value_recommendation <- "Loose Weight"
 }
 else{
   output$value_recommendation <- "Gain Weight"
 }

 }

UI.R

 names_list <- list("Adam", "Jenna","Peter")

 fluidPage(
 selectInput("select", label = h3("Select Name"), choices = names_list, selected = 1),

 hr(),
 fluidRow(column(3, verbatimTextOutput("value_name"))),
 numericInput("num", label = h3("Enter Weight"), value = 0),

 hr(),
 fluidRow(column(3, verbatimTextOutput("value_weight"))),

 hr(),
 fluidRow(column(3, verbatimTextOutput("value_recommendation")))

   )

2 个答案:

答案 0 :(得分:1)

代码中的问题是

if(output$value_weight > 150)

一般来说,output是服务器中的只写对象,而input是只读的。如果您将output$value_weight替换为input$num,那么一切都应该正常。您还需要对输出使用渲染函数:在本例中为renderPrintrenderText(请参阅文档以了解这两个渲染函数之间的差异)。

## server.R
function(input, output) {
  # You can access the value of the widget with input$select, e.g.
  output$value_name   <- renderPrint({ input$select })
  output$value_weight <- renderPrint({ input$num })

  output$value_recommendation <- renderPrint({
    if(input$num > 150)
      "Loose Weight"
    else
      "Gain weight"
  })
}

另一种方法是使用函数reactive

## server.R
function(input, output) {
  # You can access the value of the widget with input$select, e.g.
  output$value_name   <- renderPrint({ input$select })
  value_weight <- reactive({ input$num })
  output$value_weight <- renderPrint({ value_weight() })

  output$value_recommendation <- renderPrint({
    if(value_weight() > 150)
      "Loose Weight"
    else
      "Gain weight"
  })
}

答案 1 :(得分:0)

使用&#39; renderText&#39;解决了这个问题!

<强> Server.R

function(input, output) 
{

  output$value_market <- renderPrint({ input$select })
  output$value_demand <- renderPrint({ input$num })


  output$value_recommendation <- renderText({
  if(input$num > 150)
  {
    print("Loose Weight")
  }
  else{
    print("Gain Weight")
  }
  })
}