1

我正在努力制作一个 ggvis 图,其中 X 轴文本的字体大小将由滑块控制。现在我收到以下警告:

Warning message:
In toJSON(unclass(x), container, collapse, ..., .level = .level +  :
  converting an R function to JSON as null. To change this, define a method for toJSON() for a 'function' object.

这是代码:

mivector<-c(1.5,2,2.5,2,2.5,3,2.5,3,3.5)
treats<-c("A","A","A","B","B","B","C","C","C")

library(ggvis)
library(dplyr)

plotdf<-data.frame(mivector,treats)

plotdf %>% ggvis() %>% layer_points(x=~treats,y=~mivector) %>% 
  add_axis("y",grid=F,title="") %>% 
  add_axis("x",grid=F,title="",properties=axis_props(labels=list(fontSize=input_slider(min=8,max=20,value=14,label="Font size of the X-axis text"))))

我将非常感谢您的帮助!

4

1 回答 1

3

目前您无法使用ggvis.

绘图时ggvis,三种不同类型的消息会发送到您的浏览器。

  1. 绘图规范(宽度、高度、轴刻度、标签和轴字体大小等)
  2. 绘制数据(点、线、它们的颜色、不透明度等)
  3. 一个ggvis命令。目前只有一个:update.

尽管ggvis允许您创建交互式绘图,但请务必记住,您只能更新 (2) 中的数据。(一旦你更新了(2)中的数据,(3)就自动暗示了)。

然而,(1) 中的绘图规范被打包在一个JSON 对象中,并且仅在绘图启动时向您的浏览器发送一次。你可以从 ggvis 的作者那里阅读这篇文章

这意味着,您要指定的所有绘图规范都必须是 JSON 可序列化的。函数,不能打包到 JSON 中(除非按照警告指定,toJSON()function对象定义方法)。

创建的滑块input_slider()是一个函数:(更准确地说,一个反应变量,它是一个函数本身),

> slider <- input_slider(min=8,max=20,value=14,label="Font size of the X-axis text")
> typeof(slider)
[1] "closure"

因此它不能成为情节规范的一部分。


解决方案

你不能ggvis一个人解决你的问题。但是您可以通过使用Shiny来解决这个问题。您可以查看本教程的 Shiny。此外,请参阅本文了解如何将ggvis绘图集成到 Shiny 应用程序中。

简而言之,您必须:

  • 创建一个sliderInputin Shiny (类似于input_sliderin ggvis),用于指定 x 轴字体大小。这部分进入Shiny 应用程序的ui.R。
  • 在ui.R中创建一个ggvisOutput对象。
  • server.Rggvis中,将绘图表达式包装在反应式环境中,您可以在其中让fontSize等于sliderInput.

这里的诀窍是将您的ggvis呼叫包装在反应式环境中。因此,每次滑块输入发生变化时,都会重新评估反应环境,因此ggvis再次调用该函数,并 重新绘制整个图。(还记得 1. 2. 3. 阶段ggvis吗?它们都将被更新,因为ggvis每次更改滑块输入时都会进行新的函数调用)。

于 2014-08-12T18:15:27.580 回答