2017-10-09 5 views
0

Je ne suis pas une nouveauté chez R shiny et je n'ai donc pas été capable de trouver la solution à partir de questions similaires publiées sur ce site. J'essaie de lire et d'utiliser l'entrée qu'un utilisateur fournit à R shiny pour générer une sortie. J'essaie de créer une interface graphique simple où un utilisateur sélectionne le nom d'une personne (à partir d'un menu déroulant) et entre ensuite son poids. Si la hauteur est supérieure à un certain seuil, la recommandation de sortie est "Gain Weight", sinon c'est "Loose Weight".Impression de sortie basée sur l'entrée dynamique de l'utilisateur dans R Shiny

Tout semble fonctionner très bien, sauf l'erreur suivante à partir du fichier Server.R:

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

Comment puis-je lire et utiliser la variable « value_weight » dans un if-then-else condition?

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"))) 

    ) 

Répondre

1

Le problème dans votre code est la ligne

if(output$value_weight > 150) 

D'une manière générale, output s sont des objets en écriture seule dans le serveur, tandis que input s sont en lecture seule . Si vous remplacez output$value_weight par input$num, tout devrait fonctionner correctement. Vous devez également utiliser une fonction de rendu pour les sorties: dans ce cas renderPrint ou renderText (voir la documentation pour la différence entre ces deux fonctions de rendu).

## 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" 
    }) 
} 

Une autre façon de faire est d'utiliser un appel à la fonction 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" 
    }) 
} 
0

En utilisant 'renderText' a résolu le problème!

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") 
    } 
    }) 
} 
+0

Oh! Je viens de voir que vous l'avez résolu vous-même. Heureusement, ma réponse donne plus d'informations sur * pourquoi * vous avez rencontré ce message d'erreur spécifique. –

+0

Oui c'est fait! J'ai accepté ta réponse! Merci :) – Batool