【问题标题】:R Shiny - Editing a Datatable in a script that has already been writtenR Shiny - 在已编写的脚本中编辑数据表
【发布时间】:2018-01-10 20:47:23
【问题描述】:

我有一个现有的 R 脚本,它从我们公司的数据源中获取数据并创建一个图表。将数据放入一个长数据框中,然后将其与另一个包含趋势因素的类似数据框相乘,以创建低、中、高场景。然后将此数据框产品绘制成图表,以显示随时间推移和未来几年的折旧情况。

我想使用 R Shiny 使这个趋势数据框可编辑,以便应用程序的外部用户可以根据需要调整场景。有关如何最好地解决此问题的任何建议?

这是我正在使用的趋势因素的数据框(Tibble),如果有帮助的话。 (我知道有更好的方法来创建这个数据框,但我不确定如何。)

typefactors <- tibble(
  "Year" = c(year(today()), year(today()), year(today()),year(today()), year(today()), year(today()),
             year(today()) + 1, year(today()) + 1, year(today()) + 1, year(today()) + 1, year(today()) + 1, year(today()) + 1, 
             year(today()) + 2, year(today()) + 2, year(today()) + 2, year(today()) + 2, year(today()) + 2, year(today()) + 2, 
             year(today()) + 3, year(today()) + 3, year(today()) + 3, year(today()) + 3, year(today()) + 3, year(today()) + 3),
  "Projected" = c("Expected", "Expected", "High", "High", "Low", "Low",
                  "Expected", "Expected", "High", "High", "Low", "Low",
                  "Expected", "Expected", "High", "High", "Low", "Low",
                  "Expected", "Expected", "High", "High", "Low", "Low"),
  "Type" = c("Car", "Truck", "Car", "Truck","Car", "Truck",
             "Car", "Truck", "Car", "Truck","Car", "Truck",
             "Car", "Truck", "Car", "Truck","Car", "Truck",
             "Car", "Truck", "Car", "Truck","Car", "Truck"),
  "Exp" = c(
    #Current Year  Expected      High        Low 
    0.975,  0.96,   0.98,   0.98,   0.96,   0.92,
    #Year + 1      Expected      High        Low 
    0.96,   0.96,   1.01,   0.98,   0.94,   0.95,
    #Year + 2      Expected      High        Low 
    0.99,   0.98,   1.02,   1.00,   0.98,   0.97,
    #Year + 3      Expected      High        Low 
    1.00,   0.98,   1.03,   1.02,   1.00,   0.98)
)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    是的,你可以(本身)这样做。但是,您应该知道,编辑数据并不是 Shiny 的强项。

    您可以通过调用textInput 创建一个输入元素。您可以在shinyAppui 部分中调用textInput,也可以在对insertUI 的调用中动态调用。我建议从较早的开始。不管你怎么做,你需要为每个输入定义一个变量(textInput的第一个参数。在你编写的任何代码中,你可以访问这些变量。假设现在你有y0expy0low,@987654331 @等。

    为了更新,您可以监听文本输入的更改,或者(也许更简单的开始)单击“更新”按钮。因此,在shinyAppserver 部分中,您需要调用observeEvent 才能真正听到该点击。

    现在您几乎完成了:您需要将y0exp 和朋友转移到数据框中。在您的情况下,这可能类似于typefactors$Exp[2] &lt;- y0exp(在您传递给observeEvent 的函数内)。最有可能的是,您还必须重新绘制您在 click 事件处理程序中拥有的任何图表。

    我要在这里指出,有一个基本平坦的列表,前六个值是当前年份,接下来的六个值是明年等等,这确实有点不幸。我会考虑创建一个data.frame(year=c(0, 1, 2, 3, 0), tpe=c('car', 'car', 'car', 'car', 'truck'), exp=c(0.98, 0.98, 1.0, 1.02, 0.98), ...(或者我可能已经在错误的列中),然后使用类似merge 的东西来绑定它。

    除此之外,您可能会考虑持久化输入。如果我是用户,我会讨厌每次打开应用程序时都更新 12+ 个值。你可以做所有这些,你应该记住你正在注册更多的工作,因为 Shiny 擅长展示并且只是平均编辑。

    如果您想查看如何操作的完整示例:几周前我对此做了一些文章(包括 Github Repo)。你可以在这里找到这个:https://sebastianrothbucher.github.io/datascience/r/visualization/shiny/couchdb/2017/10/14/test-drive-shiny-r-rstudio-couchdb.html 和这里:https://github.com/sebastianrothbucher/ShinyCouch/blob/master/app.R

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-21
      • 2019-08-08
      • 2021-02-17
      • 2015-02-22
      • 2019-01-23
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多