2015-06-05 4 views
2

Я разрабатываю простое блестящее приложение, которое обеспечивает доступ к динамической диаграмме и соответствующей таблице. Соответствующая часть server.R коды выглядит следующим образом:Создание объекта в Shiny out renderPlot для renderTable

output$some_plot<- renderPlot({ 
    # Subset data on change in the indicator selection 
    chrt_demo_dta <- subset(x = dta_la_demo, 
          subset = <<my-conditions>>>) 
    # Define the demography chart 
    ggplot(data = chrt_demo_dta, aes(x = variable_a, y = variable_b)) + 
     geom_line(aes(colour = GEOGRAPHY_NAME), size = 2) + 
     theme_bw()}, height = 650, width = 800) 

    # Section generating table 
    output$chrt_demo_dta_tbl <- renderTable({chrt_demo_dta}) 

Проблема возникает, когда я пытаюсь получить доступ к таблице, я получаю следующее сообщение об ошибке:

Ошибки в FUNC(): объект «chrt_demo_dta 'не найден

оказывается, что объект chrt_demo_dta создается за пределами области видимости в renderTable. Мой вопрос, как я могу добиться следующего:

  1. Я хочу, чтобы на графике и соответствующей таблицы для обновления динамически при выборе, следовательно, моя идея встроить команду subset в renderPlot, который работает
  2. Я хочу использовать одно и то же подмножество в соответствующей таблице. В идеале я бы хотел, чтобы не повторял команду подмножества. Поскольку у меня есть необходимый кадр данных готов оказывается, что это только вопрос доступа к нему через renderTable

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

+5

Вы должны сделать chrt_demo_dta реактивной, например, иметь 'chrt_demo_dta <- реактивный ({subset (dta_la_demo ...})' в вашем теле сервера, а затем ссылаться на него в 'renderPlot' и' renderTable' с помощью 'chrt_demo_dta()' –

+1

Как сделать 'chrt_demo_dta' глобальную переменную, используя двойную стрелку << -, таким образом вы можете получить к ней доступ в любой функции вне renderPlot – Oscar

ответ

0

< < - оператор может иметь нежелательные последствия. Он отправляет результаты в общую среду, где она видна всем пользователям сеанса. Мало того, что это создаст условие гонки, в котором они пытаются переписать друг друга, он может подвергать конфиденциальную работу другим. У вас есть два решения: 1) повторите шаги в каждой локальной среде, 2) напишите результат на диск с уникальным именем (например, Sys.time() + хэш данных). Затем вы можете получить его, когда это необходимо в другом месте. Однако не забудьте удалить сохраненный файл, или ваше хранилище будет потреблено.

+0

IMO, решение, предложенное @Matthew Plourde в приведенном выше комментарии, - это путь , не записывая на диск. – JanLauGe

 Смежные вопросы

  • Нет связанных вопросов^_^