使用观察者将结果数据子集保存在向量

时间:2017-09-12 06:20:11

标签: r shiny

我是Shiny R.的新手。
任何人都可以帮我解决下面的问题。

我正在尝试使用数据集绘制数据,并将用户定义的选项“All”添加到UI中提供的“区域”的“选择列表”中。

当从“选择列表”中选择“全部”选项时,如何使用下面的观察者将有关所有区域的信息存储到向量“l”中,以便可以使用相同的方法根据其他用户输入进行查询< / p>

observe({
    if("All" %in% input$region) {
      selected <- setdiff(allchoice, "All")
      updateSelectInput(session, "region", selected = selected)       

         }
    })

参考:How to add a user defined value to the select list of values from dataset

UI.R

library(shiny)
library("RMySQL")
library(ggplot2)
library(plotly)
library(DT)
library(dplyr)
dataset <- read.csv("dataset.csv", header=TRUE)
dataset$X <- NULL
allchoice <- c("All", levels(dataset$region))

fluidPage(
  title = "ABC XYZ",
  hr(),
  fluidRow(
    titlePanel("ABC XYZ"),
    sidebarPanel(      
      dateRangeInput('dateRange',
                       label = 'Date Input',
                       start = as.Date("1967-01-01"), end = Sys.Date()),

      selectInput("region", label = "Region", 
                  choices = allchoice, 
                  selected = 1),

      selectInput("gender", label = "Gender", 
                  choices = unique(dataset$gender), multiple = TRUE, 
                  selected = unique(dataset$gender)),

      selectInput('x', 'X', names(dataset), names(dataset)[[2]]),
      selectInput('y', 'Y', names(dataset), names(dataset)[[8]]),
    hr()
    ),
     mainPanel(
      column(12, plotlyOutput("plot1")),
      hr(),
     column(12, plotlyOutput("plot2"))
    )
  )
)

Server.r

library(ggplot2)
library("RMySQL")
library("mgcv")
library(plotly)
function(input, output, session) {
    dataset <- read.csv("dataset.csv", header=TRUE)
    dataset$X <- NULL

    dataset$date <- as.Date(dataset$date)

    if(input$region == "All"){
      l <- observe({
      if("All" %in% input$region) {
        selected <- setdiff(allchoice, "All")
        updateSelectInput(session, "region", selected = selected)       
       }
     })
    }
    else{
      l <- reactive(subset(dataset, region %in% input$region))
    }
    k <- reactive({subset(l(), date >= as.Date(input$dateRange[1]) & date <= as.Date(input$dateRange[2]))})
    n <- reactive(subset(k(), gender %in% input$gender))

    #output plots
    output$plot1 <- renderPlotly({
    p <- ggplot(n(), aes_string(x=input$x, y=input$y)) + geom_point(alpha=0.4)
    ggplotly(p)
    })

    output$plot2 <- renderPlotly({
    q <- ggplot(n(), aes_string(x=input$x, y=input$y)) + geom_smooth()
    ggplotly(q)
    })
}

我面临的错误 -

Warning: Error in .getReactiveEnvironment()$currentContext: Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
Stack trace (innermost first):
    46: .getReactiveEnvironment()$currentContext
    45: .subset2(x, "impl")$get
    44: $.reactivevalues
    43: $ [D:\Demo\server.R#36]
    42: server $ [D:\Demo\server.R#36]
     1: runApp
Error in .getReactiveEnvironment()$currentContext() : 
  Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)

注意:我上面的词汇可能已关闭,所以如果我错了请纠正我,我对R的世界全新。 提前谢谢。

编辑1:

Listening on http://127.0.0.1:5128
    We recommend that you use the dev version of ggplot2 with `ggplotly()`
    Install it with: `devtools::install_github('hadley/ggplot2')`
    Warning in origRenderFunc() :
    Ignoring explicitly provided widget ID "2988253b22c1"; Shiny doesn't use them
    We recommend that you use the dev version of ggplot2 with `ggplotly()`
    Install it with: `devtools::install_github('hadley/ggplot2')`
    `geom_smooth()` using method = 'gam'
    Warning in origRenderFunc() : Ignoring explicitly provided widget ID "29885be33e8"; Shiny doesn't use them

甚至当我这样做时,我会得到许多例外,有时会再次出现与上述相同的例外情况。只是担心如果从长远来看同样会影响应用程序,你能就此提出一些建议吗?

再次感谢。

1 个答案:

答案 0 :(得分:1)

您还没有提供示例数据所以我只能猜测并通过查看您的错误说明问题是什么:没有活跃的反应上下文,我认为它正好在这部分:

UIImage *image = [[UIImage imageNamed:@"searchbar.png"];
UIButton* searchbutton = [UIButton buttonWithType:UIButtonTypeCustom];
[searchbutton addTarget:self action:@selector(searchBar:) forControlEvents:UIControlEventTouchUpInside]; 
searchbutton.frame = CGRectMake(0,0,22, 22);
[searchbutton setImage:image forState:UIControlStateNormal];
[searchbutton setImageEdgeInsets:UIEdgeInsetsMake(-50, 0,50, 0)];
// Make BarButton Item
 UIBarButtonItem *navItem = [[UIBarButtonItem alloc] initWithCustomView:searchbutton];
self.navigationItem.rightBarButtonItem = navItem;

[!] 但实际上我不明白你需要什么if(input$region == "All"){ l <- observe({ if("All" %in% input$region) { selected <- setdiff(allchoice, "All") updateSelectInput(session, "region", selected = selected) } }) } else{ l <- reactive(subset(dataset, region %in% input$region)) } ...我认为如果你只使用observer语句它应该可以正常工作。

[!] 此外我不知道为什么一开始你说你想要获得选择的向量(if...else...除外)并且你在{{1}中使用它作为选择的选择我可以问一下是为了什么? "All"语句应根据selectInput为您提供数据的子集。

很快就说:else为您提供input$regionif为您提供数据集 - &gt;它实际上根本没有意义..

并且应该如此简单,如果选择updatedSelectInput,则无需对else进行子集,如果有任何其他选择,则选择"All",然后选择dataset的子集。 "All"应该发生:

dataset