我正在努力将ggvis代码整合到我的闪亮应用中。我得到一个错误,我在网上找不到的描述。错误是:
Error : No data supplied to mark.
可以请某人说出我做错了什么吗?谢谢!
ui.R:
shinyUI(pageWithSidebar(
headerPanel("test"),
sidebarPanel(
fileInput("INPUT","Upload your .xls:")
),
mainPanel(
ggvisOutput("PLOT")
)
))
server.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")
})
答案 0 :(得分:0)
我不熟悉gdata
,但我对这个错误有一些怀疑。看来您的PLOTDF
被动函数将返回数据框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。在下面的代码段通知中,我将PLOTDF
传递给ggvis而不是PLOTDF()
:
PLOTDF %>% ggvis %>% ggvis(x=~a,y=~b) %>% layer_points()
%>% bind_shiny("PLOT")
有什么区别?在第一个示例中,每次data.frame更改时,您将重新绘制整个ggvis。在第二个示例中,每次data.frame更改时,ggvis中的数据点都将重新绘制。
编辑:改进语法和解释。