0

我得承认我被这个难住了。我有一个函数,它接受一个数据框并从其中的用户特定变量返回摘要数据。它看起来像这样:

   descr_function <- function(data, ...){
      stats <- data %>% 
        group_by(variable, ...) %>%
        summarize(N = length(value[!is.na(value)]),
                  Missing = length(value[is.na(value)]),
                  Perc.Avail = (length(value[!is.na(value)])/(length(value[!is.na(value)]) + length(value[is.na(value)]))) * 100,
                  Mean = mean(value, na.rm=TRUE),
                  Median = median(value, na.rm=TRUE),
                  Min = min(value, na.rm=TRUE),
                  Max = max(value, na.rm=TRUE),
                  Range = max(value, na.rm=TRUE) - min(value, na.rm=TRUE),
                  Variance = var(value, na.rm=TRUE),
                  Std.Dev = sd(value, na.rm=TRUE),
                  Coef.Var = sd(value, na.rm=TRUE)/mean(value, na.rm=TRUE),
                  SE = sd(value, na.rm=TRUE)/sqrt(length(value[!is.na(value)])),
                  Skewness = e1071::skewness(value, na.rm=TRUE),
                  Kurtosis = e1071::kurtosis(value, na.rm=TRUE),
                  IQR = IQR(value, na.rm=TRUE),
                  MAD = mad(value, na.rm=TRUE)
        )
      stats <- data.frame(stats)
      stats[,4:17] <- round2(stats[,4:17],input$descrDigits)
      return(stats)}

该函数由以下方式调用:

 all_stats <- descr_function(descrDataMelted)

UI由以下方式调用:

numericInput('descrDigits','# Decimals to Display', value = 3, min = 0, max = 10, step = 1), 

我希望函数对 input$descrDigits 做出反应。从 R Studio 网站上的基础知识开始,我得到了这样的信息:

statsNumericInput <- function(id, label = "Counter") {
  ns <- NS(id)
  numericInput(ns('descrDigits'), label)
}

numericInputServer <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {
      # PUT descr_function in here??
    }
  )
}

在 Shiny 应用调用的 UI 部分:

statsNumericInput("descrDigits", label = '# Decimals to Display', value = 3, min = 0, max = 10, step = 1)

在代码调用的服务器部分:

numericInputServer("descrDigits", variables I want to get stats for?)

我知道这个问题非常开放,但我可以使用一些指导来调整我的代码以使其正常工作。任何帮助都会很棒。谢谢你。

4

1 回答 1

0

我的看法(但未经测试):

library(dplyr)
library(shiny)
library(DT)

descr_function <- function(data, digits, ...){
  stats <- data %>% 
    group_by(variable, ...) %>%
    summarize(N = length(value[!is.na(value)]),
              Missing = length(value[is.na(value)]),
              Perc.Avail = (length(value[!is.na(value)])/(length(value[!is.na(value)]) + length(value[is.na(value)]))) * 100,
              Mean = mean(value, na.rm=TRUE),
              Median = median(value, na.rm=TRUE),
              Min = min(value, na.rm=TRUE),
              Max = max(value, na.rm=TRUE),
              Range = max(value, na.rm=TRUE) - min(value, na.rm=TRUE),
              Variance = var(value, na.rm=TRUE),
              Std.Dev = sd(value, na.rm=TRUE),
              Coef.Var = sd(value, na.rm=TRUE)/mean(value, na.rm=TRUE),
              SE = sd(value, na.rm=TRUE)/sqrt(length(value[!is.na(value)])),
              Skewness = e1071::skewness(value, na.rm=TRUE),
              Kurtosis = e1071::kurtosis(value, na.rm=TRUE),
              IQR = IQR(value, na.rm=TRUE),
              MAD = mad(value, na.rm=TRUE)
    )
  stats <- data.frame(stats)
  stats[,4:17] <- round2(stats[,4:17], digits)
  return(stats)}

# define the module
statsnumericInputUI <- function(id, label, value, min, max, step) {
  ns <- NS(id)
  numericInput(ns('descrDigits'),
               label = label,
               value = value,
               min = min,
               max = max,
               step = step),
  DTOutput(ns("result_table"))
}

statsnumericInputServer <- function(id, ...) {
  moduleServer(
    id,
    function(input, output, session) {
      all_stats <- reactive({
        descr_function(descrDataMelted, input$descrDigits, ...)
      })
      
      output$result_table <- renderDT({
        datatable(all_stats())
      })
    }
  )
}

# the shiny app
ui <- fluidPage(
  statsnumericInputUI("descrDigits", label = '# Decimals to Display', value = 3, min = 0, max = 10, step = 1)
)

server <- function(input, output, session) {
  statsnumericInputServer("descrDigits") # here you could add variables you want grouping for
}

shinyApp(ui, server)
于 2020-10-07T18:46:01.370 回答