在闪亮的R中创建基线比较数据 - 复制输入的数据帧

时间:2017-08-21 14:54:31

标签: r shiny

本练习的目的是允许用户根据输入比较两种不同的模型。为此,我创建了一个操作按钮,要求用户指定他们的基本模型,以及一个重置按钮,该按钮在添加基线之前将数据集恢复。 "基地"逻辑确定用户是否希望包含基数。

单击添加基线操作按钮后,将保存data.frame的当前状态,并使用" baseline"重命名分组变量。在它之前添加(使用粘贴)。用户可以选择与此静态基础进行比较的不同模型。

由于某种原因,我无法获得观察事件来更改数据集。 observe事件创建基线数据集很好(用print()测试),但if()函数不会改变"数据"因此停止添加到ggplot的基础。代码是这样编写的,原因有两个。 1)通过在观察事件之后包括if()函数,对数据的任何进一步更改仅改变"数据",然后将其添加到未改变的基线数据。 2)还允许创建重置按钮,该按钮仅在重新绑定之前将data.frame重置为。

这个小问题激怒了我,我无法看到我的错误。为人们提供的任何帮助提前干杯。有简单的方法可以做到这一点(对建议开放),但虹膜数据只是函数的一个例子,实际版本更复杂。

library("ggplot2")
if (interactive()) {

 ui <- fluidPage(
selectInput("rows", label = h3("Choose your species"), 
            choices = list("setosa", "versicolor", "virginica")
            ),
actionButton("base", "Create baseline"),
actionButton("reset", "Reset baseline"),
plotOutput(outputId = "plot")

            )     # close fluid page

 server <- function(input, output) {


output$plot <- renderPlot({      # create plot
  base <- "no"                   # create baseline indicator which we can change once the observeevent below is changed
  data <- iris

  data <- iris[which(data$Species == input$rows),]         # Get datasubset based on user input

  observeEvent(input$base, {                                                   # If base is Pressed, run code below:
    baseline <- data                                                           # Make Baseline Data by duplicating the users' specification
    baseline$Species <- paste("Baseline", 
                        data$Species, sep = "_")                                # Rename the grouping variable to add Baseline B4 it
    base <- "yes"                # Change our indicator of whether a baseline had been made to yes
  })                                        # Close observe Event

  observeEvent(input$reset, {    

    base <- "no"    # This is placed before the rbind so that if we want to reset it will stop the merging of the two dataframes before it happens.
  })



  if (base == "yes") {

    data <- rbind(data, baseline)       # Run once the observe event has changed baseline to yes.This is kept seperatel that way any subsequent changes to data will not effect 
                                        # the final data. This command will simple add the base onto the changed "data" before plotting
  }

  observeEvent(input$reset, {    

    base <- "no"
                             })


  ggplot(data, aes(x=Petal.Width, y = as.numeric(Sepal.Width), colour = Species)) +    # variable = each dataset selected, value = respective values for that model
    labs(x="Hypothetical X", y="Hypothetical X") +
    geom_line() 
})                                          # Close Render Plot
  }                                            # Close Serve Function
  shinyApp(ui, server)
                                 }

具有反应性对象的示例二

library(shiny)
library(ggplot2)
library("tidyr")
library("dplyr")
library("data.table")

# Lets make a fake dataset called "Data". Has 4 variable options and     
the Ages each data point relates to. 
Ages <- 1:750
Variable1 <- rnorm(n=750, sd = 2, mean = 0)
Variable2 <- rnorm(n=750, sd = 1, mean = 2)
Variable3 <- rnorm(n=750, sd = 8, mean = 6)
Variable4 <- rnorm(n=750, sd = 3, mean = 3)

Data <- as.data.frame(cbind(Ages, Variable1, Variable2, Variable3, 
Variable4) )

### UI

ui <- fluidPage(
checkboxGroupInput(inputId = "columns",                                                           
                 label = h4("Which Variables would you like in your  
model?"),                    # Input Checkbox                                      
                 choices =   c("Variable1", "Variable2", "Variable3", 
"Variable4")),

  plotOutput(outputId = "plot"),                                                        
  # Lets have our plot                                                                          
 actionButton("base", "Create baseline"),                                  
 # Baseline action
  actionButton("reset", "Reset baseline")        # Reset Action
 )  # Close UI



server <- function(input, output) {

  output$plot <- renderPlot({             
validate(need(!is.null(input$columns),  'Please tick a box to show a 
plot.'))   # Place a please choose columns for null input

data <- gather(select(Data, "Ages", input$columns), variable, value, -
Ages) ## Just doing a little data manipulation to change from wide to 
long form. This allows for calculations down the track and easier 
plotting

# Now we can modify the data in some way, for example adding 1. Will     
eventually add lots of model modifications here. 

data$value <- data$value + 1                

rVals <- reactiveValues()            # Now we create the reactive 
values object
rVals[['data']] <- data              # Making a reactive values 
function. Place Data as "data". 

  observeEvent(input$base,{
  baseline <- data
  baseline$variable <- paste("Baseline", 
                                baseline$variable, sep = "_")                
  # Rename Variables to Baseline preamble
  rVals[['baseline']] <- baseline                                             
 # Put the new data into the reactive object under "baseline"
  })

  observeEvent(input$reset,{            # Reset button will wipe the 
data
  rVals[['baseline']] <- NULL
})

if(!is.null(rVals[['baseline']]))      # if a baseline has been . 
created, then 
{rVals[['final']] <- bind_rows(rVals[['data']], rVals[['baseline']])           
# Here we can simply bind the two datasets together if Baseline exists
} else {rVals[['final']] <- rVals[['data']]}                                   
# Otherwise we can use keep it as it is


## Make our Plot !

ggplot(rVals[['final']], aes(x=Ages, y = as.numeric(value), colour = 
variable)) +    # variable = each dataset selected, value = respective 
values for that model
  labs(x="Age", y="value") +
  geom_line() 

  })                              ## Close the render plot

}                                 ## Close the server                                            

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

你有反应表达的观察者,我已经看到这导致我纠正闪亮代码的次数问题。创建反应式表达式(您的绘图函数)和观察者只指定哪个是物种的基线值(字符串)然后将其提供给绘图函数内的过滤数据:

library(shiny)
library(ggplot2)
ui <- fluidPage(
  selectInput("rows", label = h3("Choose your species"), 
              choices = list("setosa", "versicolor", "virginica")
  ),
  actionButton("base", "Create baseline"),
  actionButton("reset", "Reset baseline"),
  plotOutput(outputId = "plot")

)     # close fluid page

server <- function(input, output) {
  rVals = reactiveValues()
  rVals[['data']] = iris
  rVals[['baseline']] = NULL
  output$plot <- renderPlot({
    # here we duplicate table to manipulate it before rendering
    # the reason for duplicate is that you dont want to affect your
    # base data as it may be used elsewhere
    # note that due to R's copy-on-write this may be expensive operation and 
    # have impact on app performance
    # in all cases using data.table package is recommended to mitigate 
    # some of the CoW implications
    render.data = rVals[['data']][rVals[['data']][['Species']] %in% c(rVals[['baseline']],input$rows),]

    # here manipulate render.data

    # and then continue with plot
    ggplot(data=render.data, 
           aes(x=Petal.Width, y = as.numeric(Sepal.Width), colour = Species,group=Species)
    ) +    
      labs(x="Hypothetical X", y="Hypothetical X") +
      geom_line() 
  })
  observeEvent(input$base,{
    rVals[['baseline']]=input$rows
  })
  observeEvent(input$reset,{
    rVals[['baseline']]=NULL
  })

}                                            
shinyApp(ui, server)