首页 > 解决方案 > R Shiny 不会在闪亮的应用程序中显示输出,而只会在控制台中显示输出(以及如何正确计算子组的平均值)?

问题描述

我正在开发一个闪亮的应用程序来向我的研究参与者提供反馈。我想给他们两条反馈,一条文本输出和一条绘图输出。绘图输出是它们与样本均值、同龄人和从事相同运动的人的比较。这是我的服务器功能:

server <- function(input, output) {
  
  output$Gesamtdauer<-eventReactive(
   input$Button, {print(paste("You use media ", Daten[toupper(input$Code), "MN10_01"], "minutes a day.", "That means you use it more than", round(100*(ecdf(Daten[,"MN10_01"])(Daten[toupper(input$Code), "MN10_01"])),0), "percent of the sample."))}
  )
  output$PlotM <- eventReactive(
    input$Button, {
      barplot(unlist(
        list(
          "Du" = as.numeric(as.character(Daten[toupper(input$Code), "MN10_01"])),
          "Ref1" = 65,
          "Overallmean"= mean (as.numeric(as.character (Daten$MN10_01)))
          "sportmean" = 
          mean(
           as.numeric(as.character(Daten$MN10_01[Daten$SP03_01== Daten[toupper(input$Code), "SP03_01"]]))), 
          "agemean"= 
          mean(
           as.numeric(as.character(Daten$MN10_01[Daten$SP01_01 == Daten[toupper(input$Code), "SP01_01"]])))
        )
        ))
                        }
    )
 

}

但是我遇到了两个问题。首先,计算组均值不起作用。它每次都返回 NA。我认为这可能是 NA 值问题,但删除 NA 并不能解决问题。所以应用程序中不会有绘图,但文本输出工作正常。但是,如果我将组表示出来,R 将在控制台中创建绘图和文本输出,但不会再在应用程序中显示两者中的任何一个。谁能告诉我如何获得一个有效的组均值,以及为什么一旦绘图正确到可以在控制台中生成,Shiny 将不再在应用程序中显示任何输出?

SP_01_01 = 年龄,SP_01_03 和 MN 是媒体使用情况。下面是上下文的整个代码。

library (shiny)
library(shinydashboard)
library (fresh)
library (ggplot2)

setwd("C:\\Users\\Sportpsychologie_Hk3\\Documents\\Digimed\\APP")

Daten <- read.csv("Daten2.csv", header= TRUE, sep = ";", na.strings=c("",".","NA"), skipNul = TRUE)

rownames (Daten)= make.unique(toupper(Daten$IN04_05))

print(rownames(Daten))
#change rownames back to not having an X
#Change all Codes to Uppercase


#predefine body
body <-  dashboardBody(use_theme(mytheme),
  fluidRow(
    box(      title = "Mediennutzung", background = "green", solidHeader = TRUE, height=300,
              textOutput(outputId = "Gesamtdauer")
              
    ),
    box(background = "green", "Box content", 
      plotOutput(outputId= "PlotM"), 
        height= 300)
  ),
  
  fluidRow(
    box(
      title = "Schlaf", width = 4, solidHeader = TRUE, status = "success",
      "Box content", height= 300
    ),
    box(
      title = "Vergleich mit anderen", width = 4, solidHeader = TRUE, status = "success",
      "Box content", height= 300
    ),
    box(
      title = "Wohlbefinden", width = 4, solidHeader = TRUE, status = "success",
      "Box content", height= 300
    )
  ),
  
  fluidRow(
    box(
      width = 4, background = "green", title = "Warum ist das wichtig?",
      HTML("Ein gesunder Geist wohnt in einem gesunden Körper. Wer genug schläft hat bessere Laune, kann sich besser konzentrieren und ist weniger verletzt oder krank. Nicht zuletzt ist eine gute Erholung natürlich auch wichtig für deinen sportlichen Erfolg."), height= 125
    ),
    box(
      title = "Warum ist das wichtig?", width = 4, background = "green",
      "Auf sozialen Medien, aber auch im Alltag vergleichen wir uns immer wieder mit anderen. Das ist relativ normal, aber wenn man überall Leute sieht, die scheinbar besser, klüger oder sportlicher sind, kann sich das negativ auf den Selbstwert und die Stimmung auswirken und im schlimmsten Fall sogar psychische Erkrankungen begünstigen.", height= 125
    ),
    box(
      title = "Warum ist das wichtig?",width = 4, background = "green",
      "Was für eine Frage eigentlich- natürlich ist es wichtig, dass es dir gut geht! Weniger Stress und eine bessere Laune helfen dir außerdem, dich besser zu konzentrieren, dich besser zu erholen und fördern deine körperliche Gesundheit.", height= 125
    )
  ),
  
  fluidRow(
    box(
      width = 4, background = "green", title= "Zusammenhang zur Mediennutzung",
      "A box with a solid black background", height= 125
    ),
    box(
      title = "Zusammenhang zur Mediennutzung", width = 4, background = "green",
      "A box with a solid light-blue background", height= 125
    ),
    box(
      title = "Zusammenhang zur Mediennutzung",width = 4, background = "green",
      "This is the test box", height= 125
    )
  )
)




# hier beginnt die eigentliche App:
ui <- dashboardPage(
  dashboardHeader(title = "Deine Ergebnisse"),
  dashboardSidebar(textInput(inputId = "Code", label= "Bitte gib hier deinen persönlichen Code ein", placeholder= "z.B. 01ABAB01"),
                   actionButton (inputId = "Button", label = "Meine Ergebnisse anzeigen"),
                   HTML("<br> Zur Erinnerung: Dein Code setzt sich folgendermaßen zusammen:")
  ),
 body)



server <- function(input, output) {
  
  output$Gesamtdauer<-eventReactive(
   input$Button, {print(paste("Du nutzt digitale Medien insgesamt ", Daten[toupper(input$Code), "MN10_01"], "Minuten am Tag.", "Damit nutzt du digitale Medien mehr als", round(100*(ecdf(Daten[,"MN10_01"])(Daten[toupper(input$Code), "MN10_01"])),0), "Prozent der anderen Teilnehmer:innen."))}
  )
  output$PlotM <- eventReactive(
    input$Button, {
      barplot(unlist(
        list(
          "Du" = as.numeric(as.character(Daten[toupper(input$Code), "MN10_01"])),
          "Ref1" = 65,
          "Ref2"= mean (as.numeric(as.character (Daten$MN10_01)))
          #"Ref1" = 
          #mean(
           #as.numeric(as.character(Daten$MN10_01[Daten$SP03_01== Daten[toupper(input$Code), "SP03_01"]]))), 
          #"#REF"= 
          #mean(
           #as.numeric(as.character(Daten$MN10_01[Daten$SP01_01 == Daten[toupper(input$Code), "SP01_01"]])))
        )
        ))
                        }
    )
 

}


  

shinyApp(ui=ui, server=server)

标签: rplotshiny

解决方案


由于您没有发布示例数据,我使用 iris 来展示它是如何工作的。请根据您的用例进行修改。

Daten <- iris
Daten$MN10_01 <- iris$Petal.Length

#predefine body
body <-  dashboardBody(# use_theme(mytheme),
                       fluidRow(
                         box(      title = "Mediennutzung", background = "green", solidHeader = TRUE, height=300,
                                   verbatimTextOutput(outputId = "Gesamtdauer")
                                   
                         ),
                         box(background = "green", "Box content", 
                             plotOutput(outputId= "PlotM", height=250), 
                             height= 300)
                       ),
                       
                       fluidRow(
                         box(
                           title = "Schlaf", width = 4, solidHeader = TRUE, status = "success",
                           "Box content", height= 300
                         ),
                         box(
                           title = "Vergleich mit anderen", width = 4, solidHeader = TRUE, status = "success",
                           "Box content", height= 300
                         ),
                         box(
                           title = "Wohlbefinden", width = 4, solidHeader = TRUE, status = "success",
                           "Box content", height= 300
                         )
                       ),
                       
                       fluidRow(
                         box(
                           width = 4, background = "green", title = "Warum ist das wichtig?",
                           HTML("Ein gesunder Geist wohnt in einem gesunden Körper. Wer genug schläft hat bessere Laune, kann sich besser konzentrieren und ist weniger verletzt oder krank. Nicht zuletzt ist eine gute Erholung natürlich auch wichtig für deinen sportlichen Erfolg."), height= 125
                         ),
                         box(
                           title = "Warum ist das wichtig?", width = 4, background = "green",
                           "Auf sozialen Medien, aber auch im Alltag vergleichen wir uns immer wieder mit anderen. Das ist relativ normal, aber wenn man überall Leute sieht, die scheinbar besser, klüger oder sportlicher sind, kann sich das negativ auf den Selbstwert und die Stimmung auswirken und im schlimmsten Fall sogar psychische Erkrankungen begünstigen.", height= 125
                         ),
                         box(
                           title = "Warum ist das wichtig?",width = 4, background = "green",
                           "Was für eine Frage eigentlich- natürlich ist es wichtig, dass es dir gut geht! Weniger Stress und eine bessere Laune helfen dir außerdem, dich besser zu konzentrieren, dich besser zu erholen und fördern deine körperliche Gesundheit.", height= 125
                         )
                       ),
                       
                       fluidRow(
                         box(
                           width = 4, background = "green", title= "Zusammenhang zur Mediennutzung",
                           "A box with a solid black background", height= 125
                         ),
                         box(
                           title = "Zusammenhang zur Mediennutzung", width = 4, background = "green",
                           "A box with a solid light-blue background", height= 125
                         ),
                         box(
                           title = "Zusammenhang zur Mediennutzung",width = 4, background = "green",
                           "This is the test box", height= 125
                         )
                       )
)




# hier beginnt die eigentliche App:
ui <- dashboardPage(
  dashboardHeader(title = "Deine Ergebnisse"),
  dashboardSidebar(textInput(inputId = "Code", label= "Bitte gib hier deinen persönlichen Code ein", placeholder= "z.B. 01ABAB01"),
                   actionButton (inputId = "Button", label = "Meine Ergebnisse anzeigen"),
                   HTML("<br> Zur Erinnerung: Dein Code setzt sich folgendermaßen zusammen:")
  ),
  body)



server <- function(input, output) {
  
  Gr <- eventReactive(input$Button, {
    req(input$Code)
    paste("Du nutzt digitale Medien insgesamt ", Daten[toupper(input$Code), "MN10_01"], "Minuten am Tag.", 
          "Damit nutzt du digitale Medien mehr als", 
          round(100*(ecdf(Daten[,"MN10_01"])(Daten[toupper(input$Code), "MN10_01"])),0), 
          "Prozent der anderen Teilnehmer:innen." )
  })
  
  output$Gesamtdauer<- renderPrint({
    Gr()
  })
  
  pr <- eventReactive(input$Button, {
    c(
      "Du" = as.numeric(as.character(Daten[toupper(input$Code), "MN10_01"])),
      "Ref1" = 65,
      "Ref2"= mean (as.numeric(as.character (Daten$MN10_01)))
    )
  })
  
  output$PlotM <- renderPlot({
    barplot(pr())
  })

  
}

shinyApp(ui=ui, server=server)

输出


推荐阅读