Shiny - 在输出中使用观察函数调用的结果

2023-11-22

我有一个闪亮的应用程序,其中基于所选选项(列)数据集动态重新计算。重新计算的结果用于向用户显示另一组选项并创建绘图。

目前我正在使用observe()读取用户选择、重新计算数据集并更新 UI。但是,当显示输出(图)时,我必须再次重新计算,因为observe()不返回任何内容。

有没有办法只重新计算一次数据集?

我创建了简单的example为了说明这一点:

library(devtools)
library(shiny)
runGist('7333949') 

In server.R我想要一次调用自定义函数AggregateData in observe()并且没有来电renderUI().

应用程序代码:

服务器.R:

# shiny server side code for each call
shinyServer(function(input, output, session){
     #update variable and group based on dataset
     observe({

          require(sqldf)

          if (is.null(input$source_columns)) {
               obj <-TestData
          } else {
               obj<-AggregateData(TestData,Columns=input$source_columns)
          }

          var.opts<-namel(colnames(obj))
          var.opts.original.slicers <- namel(colnames(TestData))           
          measures <- c('m1','m2','m3','m4','m5')

          var.opts.slicers <- var.opts[!(var.opts %in% c(measures,'x'))]
          var.opts.original.slicers <- var.opts.original.slicers[!(var.opts.original.slicers %in% c(measures,'x'))]
          var.opts.measures <- var.opts[var.opts %in% measures]

          updateSelectInput(session, "source_columns", choices = var.opts.original.slicers, selected=var.opts.slicers)
          updateSelectInput(session, "xaxis", choices = var.opts.slicers,selected="x")
          updateSelectInput(session, "yaxis", choices = var.opts.measures,selected="m1")

     })

     output$plot <- renderUI({
          plotOutput("p")
     })

     #plotting function using ggplot2

     output$p <- renderPlot({
          require(ggplot2)
          obj <- AggregateData(TestData,Columns=input$source_columns)
          p <- PlotData(obj,x=input$xaxis, y=input$yaxis)
          print(p)
     })     
})

ui.R:

shinyUI(pageWithSidebar(
     # title
     headerPanel("Analysis setup"),

     #input
     sidebarPanel
     (
          selectInput("source_columns","Source Columns:", "Loading...",multiple=TRUE),
          selectInput("xaxis","X Axis:", "Loading..."),
          selectInput("yaxis","Y Axis:", "Loading...")
     ),     

     # output               
     mainPanel(
          #h3('Vintage Analysis'),
          uiOutput("plot") # depends on input 
     )
))

全局.R:

#initialize
library(ggplot2) 

TestData <- data.frame(   a = rep(LETTERS[1:4],10),
                          b = rep(c('A','B'),20),
                          c = rep(LETTERS[1:5],each=8),
                          d = rep(c('A','B'),2,each=10),
                          m1 = rnorm(40),
                          m2 = rnorm(40),
                          m3 = rnorm(40),
                          m4 = rnorm(40),
                          m5 = rnorm(40),
                          x  = rep(1:5,each=8)
)

#helper function (convert vector to named list)
namel<-function (vec){
     tmp<-as.list(vec)
     names(tmp)<-as.character(unlist(vec))
     tmp
}

# Function to aggregate data based on selected columns (Source Columns)
AggregateData <- function(data,Columns=NA) {

     require(sqldf)
     if (all(is.na(Columns))) {
          sql <- "select 
                    sum(m1) as m1, sum(m2) as m2, sum(m3) as m3, sum(m4) as m4, sum(m5) as m5, x
                 from TestData group by x" 
          sqldf(sql)                
     } else {
          sql <- paste("select ", paste(Columns, collapse =','), ",
                    sum(m1) as m1, sum(m2) as m2, sum(m3) as m3, sum(m4) as m4, sum(m5) as m5, x
                 from TestData group by ",paste(Columns, collapse =','),", x")
          sqldf(sql)          
     }
}

# Function to plot data
PlotData <- function(data,x="x",y="m1") { 
     ggplot(data, aes_string(x=x, y=y)) + geom_line()
}

Use reactiveValues():

shinyServer(function(input, output, session){
     #update variable and group based on dataset

     values <- reactiveValues()

     observe({

          require(sqldf)

          if (is.null(input$source_columns)) {
               values$obj <-TestData
          } else {
               values$obj<-AggregateData(TestData,Columns=input$source_columns)
          }
             ...
     })

     output$plot <- renderUI({
          plotOutput("p")
     })

     #plotting function using ggplot2

     output$p <- renderPlot({
          require(ggplot2)
          obj <- values$obj
          p <- PlotData(obj,x=input$xaxis, y=input$yaxis)
          print(p)
     })     
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiny - 在输出中使用观察函数调用的结果 的相关文章

随机推荐

  • 在 Excel 2019 中应用 IRibbonUI.ActivateTab

    我有现有的 VBA 代码 我的 在 Excel 2010 中工作 可激活自定义功能区选项卡 IRibbonUIObjectName ActivateTab tabID 该代码作为子程序中的标准操作存在 用于处理活动窗口的更改 在相关时激活选
  • Node.js setInterval() 在 25 天后停止执行

    在我的 Node js 应用程序中 我使用setInterval 每 1 小时运行一次特定功能 该函数正常执行大约 25 天 然后计时器停止触发 25 天似乎非常接近 Node js 的时间TIMEOUT MAX 2 31 毫秒 25 天
  • ASP.net MVC 中的自定义表单身份验证/授权方案

    我正在尝试使用表单身份验证在 ASP NET MVC 中创建自定义身份验证方案 我的想法是 我可能会在网站上有不同的区域进行管理 批准者区域和一般用户区域 并且这些区域将使用不同的登录页面 等等 这就是我想要发生的事情 用户访问受限页面 现
  • 仅显示 UIView 的角点

    如何只显示 UIView 的角点 let view UIView view layer borderColor UIColor white cgColor view layer borderWidth 2 let maskframe UIV
  • Firebase Cloud Function 已完成,状态为:“响应错误”

    我有一个云函数 它返回大量数据 50 000 个文档 作为对象 当我运行它时 我收到错误finished with status response error 仅当我导出所有数据时才会发生这种情况 当应用限制 最多 20 000 时 它可以
  • Swift 中的dispatch_once 示例

    有没有例子说明如何调度一次应该在 Swift 中使用吗 最好是苹果公司的 注意 在这种情况下 我不将其用于单例 我想运行任意代码一次 Update 我主要对在实例方法中使用此方法时推荐的约定感兴趣 但为了完整性起见 在类方法 函数和全局上下
  • 应用程序报告需要很长时间才能更新

    应用程序报告和电源管理报告需要大量时间来刷新 我注意到我的设备电池电量为 88 但在电源管理报告中电池电量仍然为 40 此外 当我更新设备上的应用程序时 应用程序报告花了很多时间才能获取更新的版本代码 有什么方法可以从设备获取最新报告吗 我
  • 从 scapy 数据包中获取信息字符串

    我在我正在构建的工具中以非交互方式 即作为库 使用 scapy 2 3 1 dev 我想获取有关数据包的一串人类可读的信息 例如您从scapy all Packet show 我尝试过使用所有三种方法 packet show packet
  • SQL Server BCP:如何在所有字段周围加引号?

    我有这个 BCP 命令 bcp DBName vieter out c test003 txt c T t S SERVER 我得到的输出 CSV 不会在字段名称周围加上引号 而是将其放在逗号周围 我怎样才能得到 t 在所有字段周围加上引号
  • Java:从日期获取月份整数

    如何从 Date 对象中获取整数月份 java util Date java util Date date new Date Calendar cal Calendar getInstance cal setTime date int mo
  • 如何从 Tkinter 窗口立即停止 Python 进程?

    我有一个 Python GUI 用来测试我工作的各个方面 目前我有一个 停止 按钮 可以在每个测试结束时终止进程 可以设置多个测试同时运行 但是 有些测试需要很长时间才能运行 如果我需要停止测试 我希望它立即停止 我的想法是使用 impor
  • scrapy使用CrawlerProcess.crawl()从脚本将custom_settings传递给spider

    我正在尝试通过脚本以编程方式调用蜘蛛 我无法使用 CrawlerProcess 通过构造函数覆盖设置 让我用默认的蜘蛛来说明这一点 用于从官方 scrapy 网站抓取引号 最后一个代码片段位于官方 scrapy 引用示例蜘蛛 class Q
  • 导出类的公共属性在 TypeScript 中使用私有类型错误

    C dev OpenCMS Website Frontend Scripts libs sinnovations gt tsc sinnovations listv iewbase ts module amd C dev OpenCMS W
  • 如何将 Enter 键绑定到 tkinter 按钮

    我正在尝试绑定回车键 with a button 在下面的代码中 我试图从条目小部件中获取条目 当按钮bt被按下 它调用enter 获取条目的方法 我还希望通过按回车键 我没有得到想要的结果 在条目小部件中输入的值不会被读取 并且enter
  • 如何在 Kubernetes 中从工作节点找到主节点

    我需要知道我当前的工作节点连接到哪个主节点 我可以通过在主节点中输入 kubectl getnodes 命令来查看工作节点 但我需要从工作节点本身找到主节点 简单来说 kubernetes集群中如何从worker节点找到master节点 您
  • 如何记录 Spring Data JPA 存储库方法的执行时间?

    我有简单的 Spring Data JPA 存储库 public interface UserRepository extends JpaRepository
  • C# 中的匿名类型

    x is compiled as an int var x 10 y is compiled as a string var y Hello z is compiled as int var z new 0 1 2 but ano is c
  • Rails Mongoid 无法进行身份验证 - 失败并出现错误 13:“未授权对 my_db.my_collection 进行查询”

    这个问题据说最新版本的Moped已经解决了 但我仍然遇到这种情况 我有一个 Rails 4 2 应用程序Mongoid 为 MongoDB 数据库创建了一个用户读写 and dbOwner角色 并设置授权 真 in the mong con
  • MPAndroidChart LineChart:使用日期而不是字符串作为 X 轴

    MPAndroid图表折线图默认情况下接受 X 轴字符串 有没有办法将日期设置为 X 轴的数据类型 仅将日期转换为字符串的问题是图表可能会根据数据点而倾斜 例如 如果我在 1 月份有一个数据条目 在 6 月份有 10 个数据条目 则默认情况
  • Shiny - 在输出中使用观察函数调用的结果

    我有一个闪亮的应用程序 其中基于所选选项 列 数据集动态重新计算 重新计算的结果用于向用户显示另一组选项并创建绘图 目前我正在使用observe 读取用户选择 重新计算数据集并更新 UI 但是 当显示输出 图 时 我必须再次重新计算 因为o