2017-03-16 40 views
1

我试图创建一个闪亮的应用程序,允许用户输入值。数据中的缺失值将被用户提供的值或默认值取代。用户输入该值后,新文件将生成名称data_new。我想使用这个文件来进一步更新我的原始数据集来替换缺失的值。我不知道如何从闪亮的应用程序文件和更新数据表中获取输入。使用单一代码中的闪亮输出更新数据表

代码第1部分:

library(shiny) 
    library(readr) 
    library(datasets) 

data_set <- structure(list(A = c(1L, 4L, 0L, 1L), B = c("3", "*", "*", "2" 
), C = c("4", "5", "2", "*"), D = c("*", "9", "*", "4")), .Names = c("A", "B", "C", "D"), class = "data.frame", row.names = c(NA, -4L)) 

    data_set1 <- data_set 

    my.summary <- function(x, na.rm=TRUE){ 
     result <- c(Mean=mean(x, na.rm=na.rm), 
        SD=sd(x, na.rm=na.rm), 
        Median=median(x, na.rm=na.rm), 
        Min=min(x, na.rm=na.rm), 
        Max=max(x, na.rm=na.rm), 
        N=length(x), 
        Nmiss = sum(is.na(x))) 
    } 

    # identifying numeric columns 
    ind <- sapply(data_set1, is.numeric) 

    # applying the function to numeric columns only 
    stats_d <- data.frame(t(data.frame(sapply(data_set1[, ind], my.summary)))) 

    stats_d <- cbind(Row.Names = rownames(stats_d), stats_d) 
    colnames(stats_d)[1] <- "variable" 

    data_new <- stats_d 
    #rownames(data) <- c() 

    data_new["User_input"] <- data_new$Max 
    data_new["OutlierCutoff"] <- 1 

    data_new["Drop_Variable"] <- "No" 

    shinyApp(
     ui <- 
     fluidPage(
      titlePanel("Univariate Analysis"), 

      # Create a new row for the table. 
      sidebarLayout(
      sidebarPanel(
      selectInput("select", label = h3("Select Variable"), 
         choices = unique(data_new$variable), 
         selected = unique(data_new$variable)[1]), 
      numericInput("num", label = h3("Replace missing value with"), value = unique(data_new$variable)[1]), 

      selectInput("select1", label = h3("Select Variable"), 
         choices = unique(data_new$variable), 
         selected = unique(data_new$variable)[1]), 
      numericInput("num1", label = h3("Outlier Cutoff"), value = unique(data_new$variable)[1],min = 0, max = 1), 
      selectInput("select2", label = h3("Select any other Variable to drop"), 
         choices = unique(data_new$variable), 
         selected = unique(data_new$variable)[1]), 
      selectInput("select3", label = h3("Yes/No"), 
         choices = list("Yes", "No")), 
      submitButton(text = "Apply Changes", icon = NULL)), 
      mainPanel(

      dataTableOutput(outputId="table") 
     )) ) 
      , 

     Server <- function(input, output) { 

     # Filter data based on selections 
     output$table <- renderDataTable({ 
      data_new$User_input[data_new$variable==input$select] <<- input$num 
      data_new$OutlierCutoff[data_new$variable==input$select1] <<- input$num1 
      data_new$Drop_Variable[data_new$variable==input$select2] <<- input$select3 
      data_new 
     }) 
     }) 

代码2部分:

data_set[as.character(data_new$variable)] <- Map(function(x, y) 
    replace(x, is.na(x), y), data_set[as.character(data_new$variable)], data_new$User_input) 
data_setN <- data_set 
+0

你没有在任何地方使用'data.table'对象。也许你正在考虑'dt'包和它们的DataTables(或者它们是指它)。 – lmo

+0

这是一个相当复杂的事情,看起来似乎是第一个闪亮的程序。它的结构并不是真正需要被动方案的结构。想想如何帮助你。 –

回答

1

这是一个相当复杂的工作,而且那里是有一些很酷的代码,你还没有真正构建它这样你就可以在Shiny中取得很大的进步。对于第一次或第二次闪亮的事业来说,这可能太复杂了。

如果我有时间,我会为你重写它,但我现在没有,我认为你可以自己做,并学到很多东西。这是我认为必须完成的:

第一个我会将submitButton更改为actionButton。在使用submitButton的Shiny中,几乎总是走错路 - 它只会导致死胡同(就像你现在发现的那样)。你需要的东西是这样的:

actionButton("applyChanges","Apply Changes"), 

,你需要做的data_newreactiveEvent功能。您现在在初始化过程中执行的计算必须移动或复制到反应代码块中。事情是这样的:

data_new <- eventReactive(applyChanges,{ 

    # code to change NAs in data_set1 to something specified in the input goes here 
    ############################################################################### 

    ind <- sapply(data_set1, is.numeric) 
    stats_d <- data.frame(t(data.frame(sapply(data_set1[, ind], my.summary)))) 
    stats_d <- cbind(Row.Names = rownames(stats_d), stats_d) 
    colnames(stats_d)[1] <- "variable" 
    d_new <- stats_d 
    d_new["User_input"] <- d_new$Max 
    d_new["OutlierCutoff"] <- 1 

    d_new["Drop_Variable"] <- "No" 
    return(d_new) 
}) 

我将你的所有输入控件转换成renderUI部件,并让它们在服务器以及使用data_new反应您刚才创建计算。像这样在ui功能:

uiOutput("select") 

而且这样的server功能:

output$select <- renderUI({ 
     selectInput("select", label = h3("Select Variable"), 
        choices = unique(data_new()$variable), 
        selected = unique(data_new()$variable)[1]), 
    ) 
    }) 

注意函数括号()在data_new()。这是因为它现在是被动的。对输入控件select,num,select1,num1,select2,select3这样做。

第四个(实际上这可能是首先要做的),观看Joe Cheng用Shiny找到的所有视频 - 观看它们多次,以了解它。反应式编程与其他形式的编程不同。需要一段时间才能得到它。

希望我没有犯任何混淆的语法错误。重组的好运气。我不认为用Shiny实际上有另一种方法,但我可能是错的。

+0

非常感谢您的详细评论。我仍然试图实施以上并提出解决方案。只是一个小问题,我们如何在返回(d_new)后检查/查看文件d_new。我不想在ui中使用这个文件,但想在全局R环境中检查它。有什么办法可以做到吗? –

+0

Upvote和验收会很好。尝试“utils :: View(mtcars)”以获得一个弹出窗口,其中包含数据帧的当前内容。例如,使用ui'actionButton(“b1”,“View Mtcars”)'和在服务器'observeEvent(输入$ b1,{utils :: View(mtcars)})''中的 –

+0

会得到一个包含mtcars数据帧的弹出窗口。 –