2015-08-21 3 views
1

Мне нужно, чтобы пользовательская подсказка отображалась, когда пользователь наводил на квадрат в treemap, и я использую в качестве основы статью this.Настройка всплывающей подсказки в treemap с использованием R и googleVis

TreeMap должен быть построен с R и googleVis библиотеки с использованием функции. В соответствии с указанной статьей я создал параметр generateTooltip в списке опций функции и присвоил ему код для создания анонимной функции. Вот завершенный код для вызова:

plot(gvisTreeMap(Data, 
    idvar="Name.of.the.Company", 
    parentvar="Name.of.the.Parent", 
    sizevar="Loan.Size..INR.in.million.", 
    options=list(width='*', 
     height=600, 
     minColorValue=0, 
     maxColorValue=0, 
     generateTooltip = "function(row, size, value) { 
           return '<div style=\"background:#fd9; padding:10px; border-style:solid\">' + 'Some text' + '</div>'; 
          }" 
))) 

Полученный JS код в моем HTML-страницы выглядит следующим образом:

// jsDrawChart 
... 
var options = {}; 
options["height"] = 600; 
options["minColorValue"] = 0; 
options["maxColorValue"] = 0; 
options["generateTooltip"] = "function(row, size, value) { return '<div style=\"background:#fd9; padding:10px; border-style:solid\">' + 'Some text' + '</div>'; }"; 

Здесь options["generateTooltip"] инициализируется со строкой, которая вызывает ошибку (при Я ожидал, что строка будет автоматически распознана как определение функции). Итак, я хотел бы знать, есть ли способы передать определение функции из среды R в свойство generateTooltip?

ответ

3

Я знаю, что это сообщение больше года назад .. но пока я имел дело с такой же проблемой сегодня, я не мог найти какое-либо конкретное решение в другом месте, поэтому я решил поделиться своим решением в надежде что кто-то найдет это полезным в будущем.

Я фактически использовал ваш пост, Мстислав, в качестве отправной точки, но я столкнулся с той же проблемой, пытаясь назначить функцию JavaScript в списке опций. После нескольких неудачных попыток удалить кавычки (я смог удалить кавычки с as.symbol() и unquote(), но получил сообщения об ошибках после передачи результата в gvisTreeMap), я понял, что суть проблемы заключается в том, что в Google Charts documentation предполагается, что вы пишете код непосредственно в JavaScript, в то время как вы фактически подаете аргументы в функции R, которые затем переводит их в JavaScript.

Поскольку, кажется, нет простого способа передать функцию JavaScript в вызов функции gvisTreeMap, я подумал, что попытаюсь определить, где в исходном коде googleVis этот список вариантов переводится на JavaScript, а затем непосредственно изменять Javascript согласно статье.

После загрузки googleVis source code и отслеживании назад от функции gvisTreeMap (в gvisTreeMap.R), я нашел фрагмент кода мне нужно изменить в gvis.R:

jsDrawChart <- ' 
// jsDrawChart 

// ** begin modified portion **// 
function showFullTooltip(row, size, value) { 
return \'<div style="background:#fd9; padding:10px; border-style:solid">\' + 
\'Group: \' + row + \'<br>\' + 
\'Headcount: \' + size + \'<br>\' + 
\'Turnover Rate: \' + value + \' </div>\'; 
} 
// ** end modified portion **// 

function drawChart%s() { 
var data = gvisData%s(); 
var options = {}; 
%s 
// ** begin modified portion **// 
options["generateTooltip"] = showFullTooltip; 
// ** end modified portion **// 
%s 
%s 
%s 
} 
%s 
' 
jsDrawChart <- sprintf(jsDrawChart, chartid, chartid, 
         paste(gvisOptions(options), collapse="\n"), 
         jsFormats, 
         gvisNewChart(chartid,type,options), 
         gvisListener(chartid, type, options), 
         gvisEditor(chartid,type,options) 
) 

Есть две части I modifed (завернутый в // ** начало/конец измененной части ** //). Первая часть определяет функцию showFullTooltip, а вторая часть добавляет параметр generateTooltip в список опций. Это работало для меня как прелесть. В статье Google Charts очень полезно описать, как изменить код JavaScript. Хитрость - это просто выяснить, где искать этот фрагмент кода в программах googleVis.

Чтобы запустить этот код, я обнаружил, что вам не нужно «переопределять» пакет googleVis. Вам просто нужно сохранить копию измененного gvis.R и немодифицированного gvisTreeMap.R в папке проекта (или в любом месте, доступном для вас). Затем в верхней части вашей программы загрузите библиотеку googleVis (так что у вас есть все зависимости), а затем укажите версии gvis.R и gvisTreeMap.R (в этом порядке). Измененные версии функций googleVis затем переопределяют те, которые вы загрузили из библиотеки googleVis.