在Shiny中使用HTML UI(index.html)添加交互式图表

5
我可以看出ggvis、rCharts等与server.r + ui.r结构相匹配。现在我正在尝试制作一个HTML UI,但是我无法找到任何关于如何将交互式图表传递给HTML UI的线索。有什么提示吗?
已经调查了ggvis、rCharts和NBD3,但没有调查过plotly。避免使用googleVis。
曾经有一个类似的问题被Evan Farrell提出过,但没有得到回复-https://groups.google.com/forum/#!topic/ggvis/GsZQRl3VOZ4 编辑:这些需要自定义绑定吗?还有其他更简单的选择吗?我认为输出将是由JavaScript生成的SVG,因此不可能手动包含库并将SVG绑定到div元素中吗?
编辑2:我能否以某种方式将我的数据集传递给UI,并在index.html中构建一个D3图表?

你可以通过简单的谷歌搜索找到很多例子。首先,可以访问这个页面底部:'http://ggvis.rstudio.com/interactivity.html',看一个基本的 ggvis/shiny 示例。 - hvollmeier
谢谢@hvollmeier,我正在努力将ui.r部分转换为适用于HTML UI的内容。你有什么建议吗? - TheComeOnMan
1
如果您使用html-ui,则根本不应该有ui.r文件。您只需将一个名为index.html的文件放入“www”目录中(该目录是项目目录的子目录),它将替换“ui.r”文件。请参阅此链接http://shiny.rstudio.com/articles/html-ui.html。 - hvollmeier
1
是的,我也明白。现在你能帮忙把这两个拼起来吗?我可以编写一个HTML UI,并且我可以通过ui.r绘制ggvis。现在我该如何通过HTML UI绘制ggvis呢? - TheComeOnMan
2个回答

5

您可以在这里找到与ggvis一起使用的shiny等示例:

library(shiny)
library(ggvis)

runApp(list(

  ui={
    library(ggvis)
    shinyUI(pageWithSidebar(
      div(),
      sidebarPanel(
        sliderInput("n", "Number of points", min = 1, max = nrow(mtcars),
                    value = 10, step = 1),
        uiOutput("plot_ui")
      ),
      mainPanel(
        htmlOutput("ggvis_plot"),
        tableOutput("mtc_table")
      )
    ))

  },

  server={
    library(ggvis)
    shinyServer(function(input, output, session) {

      output$ggvis_plot <- renderUI({
        ggvisOutput("plot1")
      })
      # A reactive subset of mtcars
      mtc <- reactive({ mtcars[1:input$n, ] })
      # A simple visualisation. In shiny apps, need to register observers
      # and tell shiny where to put the controls
      mtc %>%
        ggvis(~wt, ~mpg) %>%
        layer_points() %>%
        bind_shiny("plot1")
      output$mtc_table <- renderTable({
        mtc()[, c("wt", "mpg")]
      })
    })
  }
))

要将它转换为一个 html-UI,shiny 项目,您需要创建一个具有以下结构的目录(如 此处 所述,由 hvollmeier 指出):
<shinnyappName>
|-- www
     |-- index.html
|-- server.R

服务器部分将保持不变。对于我们的示例,index.html 部分应该是这样的:
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <script type="application/shiny-singletons"></script>
  <script type="application/html-dependencies">json2[2014.02.04];jquery[1.11.0];shiny[0.11.1];ionrangeslider[2.0.2];bootstrap[3.3.1]</script>
<script src="shared/json2-min.js"></script>
<script src="shared/jquery.min.js"></script>
<link href="shared/shiny.css" rel="stylesheet" />
<script src="shared/shiny.min.js"></script>
<link href="shared/ionrangeslider/css/normalize.css" rel="stylesheet" />
<link href="shared/ionrangeslider/css/ion.rangeSlider.css" rel="stylesheet" />
<link href="shared/ionrangeslider/css/ion.rangeSlider.skinShiny.css" rel="stylesheet" />
<script src="shared/ionrangeslider/js/ion.rangeSlider.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="shared/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<script src="shared/bootstrap/js/bootstrap.min.js"></script>
<script src="shared/bootstrap/shim/html5shiv.min.js"></script>
<script src="shared/bootstrap/shim/respond.min.js"></script>

</head>
<body>
  <div class="container-fluid">
    <div class="row">
      <div></div>
    </div>
    <div class="row">
      <div class="col-sm-4">
        <form class="well">
          <div class="form-group shiny-input-container">
            <label class="control-label" for="n">Number of points</label>
            <input class="js-range-slider" id="n" data-min="1" data-max="32" data-from="10" data-step="1" data-grid="true" data-grid-num="7.75" data-grid-snap="false" data-prettify-separator="," data-keyboard="true" data-keyboard-step="3.2258064516129"/>
          </div>
          <div id="plot_ui" class="shiny-html-output"></div>
        </form>
      </div>
      <div class="col-sm-8">
        <div id="ggvis_plot" class="shiny-html-output"></div>
        <div id="mtc_table" class="shiny-html-output"></div>
      </div>
    </div>
  </div>
</body>
</html>

如果您保存由shinyUI生成的html页面为index.html,并根据您的需求进行修改,同时删除任何不必要的内容,那么您就应该编写它或者可以获取它。

 library(shiny)
 runApp("<shinyAppName>")

谢谢@Stanislav。我能够正确地看到表格,但是没有散点图。div plot-gear-icon 已经填充,但是 div plot 是空的。你运行时是否也看到了相同的结果? - TheComeOnMan
我已经更新了"server.R"和"index.html"。简言之,我的做法是将所有ggvis代码从ui.R移动到server.R中,使UI不再包含它们,并且由于index.html文件是从ui.R构建的,因此它也不包含ggvis并且可以正常工作(index.html是从ui.R生成的文件(仅在一台机器上,您可以直接使用server.R和index.html))。注意:您需要安装ggvis和shiny。 - Stanislav
你的逻辑看起来很合理,但仍然无法正常工作。plot1 div为空。 - TheComeOnMan
我能够运行您发布的ggvis链接。您的服务器+用户界面和链接之间唯一的区别是“ggvisoutput”函数在服务器或用户界面中,对吗?我之所以问这个问题是因为您的服务器+用户界面对我也不起作用。 - TheComeOnMan
@TheComeOnMan,你能用plotly绘图解决这个问题吗?我也遇到了同样的问题:HTML UI方法文档非常简略,我不清楚如何将div绑定到app.r(或server.r)中的renderPlotly方法。使用shiny-html-outputshiny-plot-output都无法解决问题。 - jimjamslam
显示剩余10条评论

0

您可以使用Shiny、ggplot2和Plotly生成交互式的基于Web的图表。这些图表是用D3.js渲染的,可以嵌入HTML

一般来说,这意味着您有两个选项。首先,生成一个带有交互式图形的Shiny应用程序并嵌入整个应用程序。其次,从Shiny应用程序内部或使用ggplot2生成交互式图形,然后嵌入该图形。

有关使用Shiny创建交互式图形的代码和说明,请参见本教程。这种方法可以让您制作像这样的交互式图形:



enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接