Есть ли способ отобразить или получить имя точки на графике rgl, визуализированного через Shiny? - PullRequest
1 голос
/ 30 января 2020

Я использую пакет RGL и Shiny, чтобы создать приложение, которое отображает различные выбранные комбинации основных компонентов из PCA в виде трехмерного графика. Я рисую десятки тысяч точек данных за раз, поэтому маркировка всех точек на графике - это не go, иначе я просто смотрю на шарик. Тем не менее, все равно было бы очень полезно иметь возможность получать названия определенных точек на графиках. Неважно, имеет ли это значение с помощью маркировки точек на графике или отображения имен в Shiny textOutput.

Первый подход, который я попробовал, - это использовать функцию identif3d () внутри Shiny, чтобы попытаться создайте реактивное значение с именем точки, которую я мог бы использовать в пользовательском интерфейсе в качестве вывода, но это не сработало, и я предполагаю, что это связано с тем, что для функции identif3d () нет способа связаться с приложением Shiny.

Следующим подходом было использование пакета перекрестных помех, так как я видел здесь смутное упоминание о том, что он полезен для выполнения чего-то подобного. Я создал объект rglShared, комбинирующий один график для точек и другой график для меток (устанавливая их так, чтобы они отображались только при выделении), и попытался выбрать точки интереса на графике либо с помощью rglMouse (), либо установив mouseMode в «выбор». Я не смог заставить rglMouse () работать внутри Shiny, и когда я попытался изменить mouseMose (), используя par3d или глянцевыйSetPar3d, Shiny это не понравилось, и он просто перестал отображать любой график.

Вот код для некоторого игрушечного примера, который я пытался заставить работать, используя второй подход с данными mtcars и rglMouse (). Кнопка выбора mouseMode выглядит нормально, но ее изменение фактически не влияет на функцию мыши внутри графика rgl.

library(shiny)
library(crosstalk)
library(rgl)
library(manipulateWidget)

data(mtcars)

ui = fluidPage(
  combineWidgetsOutput("rgl_plot"),
)

server = function(input, output, session){
  output$rgl_plot = renderCombineWidgets({
  rgl.open(useNULL=T)
  ids <- plot3d(mtcars[, 1:3])
  sharedData <- rglShared(ids["data"])
  sharedLabel <- rglShared(text3d(mtcars[, 1:3], text = 1:32,
                                  adj = -0.5),
                           group = sharedData$groupName(),
                           deselectedFade = 0,
                           selectedIgnoreNone = FALSE) 
    rglMouse(rglwidget(shared = list(sharedData, sharedLabel)))
  })
}

shinyApp(ui = ui, server = server)

Я использую Shiny version 1.4.0, rgl версия 0.100.30 и перекрестные помехи версия 1.0.0 с R 3.6.1.

1 Ответ

0 голосов
/ 05 февраля 2020

Переход от использования RGL к использованию plotly для создания трехмерного графика внутри Shiny во многом решил мою проблему, поскольку всплывающая подсказка отображала именно ту информацию, которую я хотел.

...