Я использую пакет 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.