R ggvis: sliderInput для fontSize

Я изо всех сил пытаюсь сделать график 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"))))

Буду очень благодарен за вашу помощь!


person bsierieb    schedule 12.08.2014    source источник
comment
ggvis использует vega для рисования графиков. Типичный рисунок состоит из трех этапов: создание вега-объекта с определенными параметрами (ось, сетка и т. д.), привязка данных и, наконец, обновление графика в соответствии с данными. Вы можете указать атрибуты (включая метки осей) только при создании графика (и его вега-объекта). Следовательно, метки осей и размеры шрифта не могут быть изменены динамически.   -  person Xin Yin    schedule 12.08.2014


Ответы (1)


В настоящее время вы не можете сделать это с 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.

Короче говоря, вам придется:

  • Создайте sliderInput в Shiny (аналогично input_slider в ggvis), который используется для указания размера шрифта по оси x. Эта часть входит в ui.R приложения Shiny.
  • Создайте объект ggvisOutput в ui.R.
  • В server.R оберните свои графические выражения ggvis в реактивную среду, в которой вы можете сделать fontSize равным значению из sliderInput.

Хитрость заключается в том, чтобы обернуть вызов ggvis в реактивную среду. Таким образом, каждый раз, когда значение ползунка изменяется, реактивная среда оценивается заново, поэтому функция ggvis вызывается снова, и график ВЕСЬ перерисовывается. (Помните этапы 1. 2. 3. ggvis? Все они будут обновлены, потому что буквально вы делаете новый вызов функции ggvis каждый раз, когда вы меняете ввод ползунка).

person Xin Yin    schedule 12.08.2014
comment
Если вы хотите решить эту проблему с помощью Shiny и у вас возникли проблемы, дайте мне знать, и я буду рад помочь. - person Xin Yin; 12.08.2014