1

我正在努力将 ggvis 代码合并到我闪亮的应用程序中。我收到一个错误,我在网上找不到该错误的描述。错误是:

Error : No data supplied to mark.

请有人指出我做错了什么?谢谢!

ui.R:

shinyUI(pageWithSidebar(
  headerPanel("test"),
  sidebarPanel(
    fileInput("INPUT","Upload your .xls:")
  ),
  mainPanel(
    ggvisOutput("PLOT")
  )
))

服务器.R:

library(ggvis)

shinyServer(function(input, output, session) {

  PLOTDF<-reactive({
    if (is.null(input$INPUT)==F) {

      library(gdata)
      tax<-read.xls(input$INPUT$datapath,check.names=F)

      plotdf<-data.frame(c(tax[1,1],tax[1,2]),c(tax[2,1],tax[2,2]))
      colnames(plotdf)<-c("a","b")

      plotdf

    }
  })

  reactive({
    plotdf_read<-PLOTDF()
    plotdf_read$data %>% ggvis(x=~a,y=~b) %>% layer_points()
    }) %>% bind_shiny("PLOT")

})
4

1 回答 1

0

我不熟悉,gdata但我对这个错误有一些怀疑。看起来您的PLOTDF反应函数将返回一个 dataframe plotdf。我不确定为什么你有plotdf_read$data而不是plotdf_read在你的情节声明中。 plotdf_read$data正在尝试从数据框中获取“数据”列——看起来数据框只有“a”和“b”列。我想你的意思是使用plotdf_read %>% ggvis....

在将反应式传递给 ggvis 时,这里还有一个技巧。现在你正在做类似的事情:

reactive({
  PLOTDF() %>% ggvis(x=~a,y=~b) %>% layer_points()
  }) %>% bind_shiny("PLOT")

基本上,您在响应式上下文中获得一个 data.frame 并将其传递给 ggvis。这肯定会奏效,但我认为有更好的方法。

ggvis 被设计为接受“裸反应”——我们可以将反应本身传递给 ggvis。在下面的代码段通知中,我传入PLOTDFggvis 而不是PLOTDF()

PLOTDF %>% ggvis %>% ggvis(x=~a,y=~b) %>% layer_points()
%>% bind_shiny("PLOT")

有什么不同?在第一个示例中,每次 data.frame 更改时,您都会重新绘制整个 ggvis。在第二个示例中,每次您的 data.frame 更改时,只会重新绘制 ggvis 中的数据点。

编辑:改进语法和解释。

于 2014-08-11T14:35:30.857 回答