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

Posted

技术标签:

【中文标题】R Shiny 不会在闪亮的应用程序中显示输出,而只会在控制台中显示输出(以及如何正确计算子组的平均值)?【英文标题】:R Shiny won't show output in the shiny app but only in the console (and how to properly calculate means for a subgroup)? 【发布时间】:2021-10-03 12:01:12 【问题描述】:

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

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)

【问题讨论】:

请尝试使用renderPlot()plotOutput,以及renderText()textOutput()eventReactive() 只是一个反应对象,而不是输出对象。 但是为什么 textOutput 会像这样工作(只要你不添加绘图输出)?如果我仍然希望输出仅在参与者按下“开始”按钮时出现,我应该在哪里放置渲染功能? 【参考方案1】:

由于您没有发布示例数据,我使用 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)

【讨论】:

以上是关于R Shiny 不会在闪亮的应用程序中显示输出,而只会在控制台中显示输出(以及如何正确计算子组的平均值)?的主要内容,如果未能解决你的问题,请参考以下文章

闪亮的服务器不会加载应用程序

R 中 Shiny 中的时间序列预测; Shiny 显示 unix 纪元时间

R Shiny,在调用模块中的DT :: replaceData不起作用

在 R 中的 Shiny 中部署 dataTableOutput 和绘图; “整理” dataTableOutput

如何使用 DT、R 和 Shiny 在表格的单元格中嵌入图像

R Shiny:PlotOutput 未在 Shiny 应用程序中更新