Home Forum Fuoritema Shinyapp problem

Tagged: 

This topic contains 7 replies and has 2 voices.

Viewing 8 posts - 1 through 8 (of 8 total)
  • Author
    Posts
  • #5526

    AnnamariaP
    Participant

    Ciao, dovrei sviluppare una serie di domande concatenate utilizzando shinyapp. In pratica a seconda della risposta che si da(es. vero o falso) viene stampato un output differente. Una specie di flowchart ma fatto come questionario. Spero ci sia qualcuno che possa aiutarmi a capire come fare.
    Grazie

    #5527
    Davide Massidda
    Davide Massidda
    Moderator

    Eh… hai chiesto nulla ;)
    Io conosco Shiny e ci lavoro abitualmente. Si tratta di un sistema abbastanza semplice da imparare se hai già manualità con R e hai un po’ di dimestichezza con i linguaggi per la formattazione testuale web (sostanzialmente HTML e CSS).
    Proprio perché lo conosco, ti posso dire che è impossibile spiegarti in un post cosa devi fare. Davvero. Anche perché l’idea che hai esposto è troppo vaga, e, in ogni caso, un’applicazione del genere richiede centinaia di righe di codice che non posso mettermi a scriverti qui, in pochi minuti.
    Il consiglio che ti posso dare è di partire dagli esempi di applicazione Shiny che si trovano sul web. Cerca qualcosa di semplice e che un po’ si avvicina a quello che ti serve, o almeno a una sua parte, quindi studiane il codice e prova, piano piano, a svilupparlo.
    Se parti già da delle buone basi, la curva di apprendimento con Shiny è molto ripida.

    #5528

    AnnamariaP
    Participant

    Purtroppo sono giorni che cerco esempi sul web ma nulla di fatto. Ho trovato solo un pacchetto: learnr che però genera una domanda alla volta. Comunque grazie per avermi risposto, spero di uscirne.

    #5529
    Davide Massidda
    Davide Massidda
    Moderator

    Comunque, se ho compreso bene lo scopo del progetto, ti possso assicurare che quello che vuoi fare non è affatto banale e richiede molta esperienza.
    Praticamente vuoi sviluppare un questionario adattivo e questo richiede pagine responsive che si adattano dinamicamente alle scelte dell’utente, un database che contiene una banca di domande ben organizzato e una conoscenza approfondita della gestione degli eventi con Shiny.
    Io quindi partirei con il cercare di sviluppare una piccola parte del progetto e ampliarlo piano piano.

    #5530

    AnnamariaP
    Participant

    Infatti sto tentando di fare proprio questo, sono arrivata fino alla creazione del primo output(cioè la prima risposta se si sceglie vero o falso) ora devo praticamente capire come fare a passare al quesito successivo.

    #5531
    Davide Massidda
    Davide Massidda
    Moderator

    Allora, io ho costruito un prototipo di test adattivo con Shiny, estremamente stupido a dire il vero, ma che potrebbe aiutarti. Ci tengo a precisare che il codice che segue è una possibile soluzione al problema, non necessariamente la migliore, non universale e forse neanche adatta al tuo caso… ma insomma, ci ho provato.

    Il codice si appoggia a un file CSV che contiene la banca item. Il file deve essere nominato item_bank.csv e deve contenere questa roba:

    code;text;alternative;goto
    1;Quale gusto preferisci?;Cioccolato;2
    1;;Fragola;3
    2;Ti piace il rum?;Si;101
    2;;No;3
    3;Ti piace la frutta?;Poco;4
    3;;Abbastanza;4
    3;;Molto;102
    4;Sei astemio?;No;103
    4;;Si;102
    

    Questi invece sono gli script.

    server.R

    item_bank <- read.csv2("item_bank.csv",stringsAsFactors=FALSE)
    style <- list(main="margin: 5em;")
    
    shinyServer(
        function(session, input, output) {
            
            progress <- reactiveValues(goto=0,text="0",alternative="")
            
            observeEvent(input$go_next, {
                if(progress$goto > 0) {
                    if(progress$goto < 100) {
                        progress$goto <- item_bank$goto[
                            item_bank$code==progress$goto & item_bank$alternative==input$choice]
                    } else {
                        progress$goto <- 0
                        progress$alternative <- ""
                    }
                } else
                    progress$goto <- 1
                if(progress$goto > 0 & progress$goto < 100) {
                    select <- item_bank$code==progress$goto
                    progress$text <- item_bank$text[which(select)[1]]
                    progress$alternative <- item_bank$alternative[select]
                    updateRadioButtons(session, "choice",
                        label = progress$text,
                        choiceNames = progress$alternative,
                        choiceValues = progress$alternative
                    )
                } else {
                    progress$text <- as.character(progress$goto)
                }
            })
            
            output$message <- renderText({
                switch(progress$text,
                    "0" = "Premi il pulsante per cominciare.",
                    "101" = "Ti consiglio di fumarti un sigaro.",
                    "102" = "Dovresti farti un succo di frutta.",
                    "103" = "Rilassati con uno spritz aperol."
                )
            })
            
            output$body <- renderUI({
                if(progress$goto==0) {
                    div(style=style$main,
                        fluidRow(
                            htmlOutput("message"),
                            div(),
                            br(),
                            actionButton("go_next", "Inizia il test")
                        )
                    )
                } else {
                    if(progress$goto<100) {
                        div(style=style$main,
                            fluidRow(
                                radioButtons("choice", label="", choiceNames="", choiceValues=""),
                                actionButton("go_next", "Prosegui")
                            )
                        )
                    } else {
                        div(style=style$main,
                            fluidRow(
                                htmlOutput("message"),
                                br(),
                                actionButton("go_next", "Torna alla home")
                            )
                        )
                    }
                }
            })
        }
    )
    

    ui.R

    library("shiny")
    library("shinydashboard")
    
    header <- dashboardHeader(title="Questionario sui gusti")
    sidebar <- dashboardSidebar(disable=TRUE)
    body <- dashboardBody(uiOutput("body"))
    ui <- dashboardPage(skin="yellow", title="shinyJar", header, sidebar, body)
    #5532

    AnnamariaP
    Participant

    Questo questionario è davvero carinissimo!!! Mi è stato davvero molto utile. Grazie mille. Colgo l’occasione per chiedere se lei o lo staff organizzate dei corsi per l’uso di shinyapp o anche corsi volti allo sviluppo di pacchetti R.

    Grazie ancora per il code TOP!! :D

    #5533
    Davide Massidda
    Davide Massidda
    Moderator

    Al momento purtroppo no, non sono previsti corsi causa anche problemi logistici. Per approfondimenti, puoi contattarmi direttamente via mail: davide.massidda _chiocciola_ gmail.com.

    Buon lavoro!

Viewing 8 posts - 1 through 8 (of 8 total)

You must be logged in to reply to this topic.