Я разрабатываю геоаналитическое программное обеспечение с R-скриптом с использованием rgdal и надстройки RSAGA. Я недавно нашел блестящий аддон, и я доволен тем, насколько легко можно обернуть мой контроллер цикла в пользовательский интерфейс. К сожалению, у меня возникают проблемы с необходимыми реактивными функциями, чтобы сделать группу значений флажка (которые являются отдельными экодистриками) отображать реактивный предварительный просмотр контура каждого выбранного экодрайона в поле флажка.
У меня есть checkboxGroupInput с целочисленным списком из 110 экодистриков (244, 278, 302 и т. Д.) И обработчик outputPlot для реактивного вывода.
Чтобы понять суть, файл формы читается для извлечения списка экодистриков для группы флажков ('ed_all'), а также извлекается фигура с контуром каждого экодрайона ('xcheck'). По сути, я пытаюсь достичь двух вещей:
1 - создать реактивную переменную ed_list, которая изменяет список целых чисел, когда Ecodistricts выбираются с помощью флажков
2 - Сделать реактивное пересечение многоугольника, используя реактивную переменную ed_list и форму «xcheck», чтобы построить реактивный график выбранных экологических районов.
В настоящее время я использую rsaga.geoprocessor, завернутый в реактивную команду, чтобы выполнить пересечение, но я открыт для предложения, если есть лучший способ. Каждый раз, когда я пытаюсь выполнить этот код, он дает мне ...
«Ошибка в .getReactiveEnvironment () $ currentContext (): операция не разрешена без активного реактивного контекста. (Вы пытались сделать что-то, что можно сделать только внутри реактивной функции.)»
Или что-то в этом роде.
Ниже приведен вырезанный код, относящийся к моему вопросу:
ui.r
library(shiny)
library(rgdal)
setwd("D:\\BC_soil_map")
ed <- readOGR(".\\BC_data\\BC_Shapes\\BC_soils\\Soil_Polygons_SLC", layer = "EcoDistricts_BC")
ed_all <- ed$ECODISTRIC
ed_null <- ed$EDnull
shinyUI(pageWithSidebar(
headerPanel(div(align = "center",
"Soil Mapping Data-Quilt Application")),
sidebarPanel(div(align = "center",
h4("Select and EcoDistrict"),
checkboxGroupInput("ed_chkbx",
label = "",
choices = ed_all,
selected = ed_all))),
mainPanel(div(align = "center",
h4("Preview"),
plotOutput("preview",
width = "500px",
height = "500px"))
))
Это серверная часть кода ..
server.R
library(shiny)
library(RSAGA)
library(rgdal)
setwd("D:\\BC_soil_map")
ed <- readOGR(".\\BC_data\\BC_Shapes\\BC_soils\\Soil_Polygons_SLC", layer = "EcoDistricts_BC")
xcheck <- subset(ed, select = c("ECODISTRIC","SHAPE_LENG","SHAPE_AREA"))
ed_all <- ed$ECODISTRIC
ed_null <- ed$EDNONE
shinyServer(function(input, output, session) {
x <- reactiveValues(input$ed_chkbx == TRUE)
ed_list<- reactiveValuesToList(x, all.names = FALSE)
previewInput <- reactive({
rsaga.geoprocessor("shapes_polygons",
"Polygon Intersection",
list(SHAPES_A=xcheck),
FIELD_A="ECODISTRIC",
SHAPES_B=ed_list(),
SHAPES_AB= ##THIS IS USUALLY THE DIRECTORY FOR THE OUTPUT OF THE INTERSECTED FILE##
METHOD=1)})
output$preview <- renderPlot(previewInput(),
width = "150px",
height = "150px",
res = 72,
env = parent.frame(),
quoted = FALSE,
func = NULL)
})