R ggvis:fontSize的sliderInput

时间:2014-08-12 16:43:06

标签: r ggvis

我正在努力制作一个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"))))

我将非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

目前无法使用ggvis执行此操作。

ggvis正在绘制时,会向您的浏览器发送三种不同类型的消息。

  1. 绘图规格(宽度,高度,轴刻度,标签和轴字体大小等)
  2. 绘制数据(点,线,颜色,不透明度等)
  3. ggvis命令。目前只有一个:update
  4. 虽然ggvis允许您创建interactive plots,但请务必记住,您只能更新(2)中的数据。 (一旦更新(2)中的数据,则自动隐含(3)。

    然而,(1)中的绘图规范打包在 JSON对象中,并在启动绘图时将浏览器仅发送一次。您可以阅读this post from ggvis's author了解相关信息。

    这意味着,您要指定的所有绘图规范都必须是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解决此问题。你可以查看这个tutorial for Shiny。 另外,请参阅this article了解如何将ggvis绘图集成到Shiny应用程序中。

    简而言之,您必须:

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

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