Как управлять моим R-кодом в приложении Shiny или ShinyDashboard?

Я сделал приложение для блестящей панели, в котором сейчас довольно много строк кода, и мне интересно, есть ли способы разделить код на разные файлы . R файлы. Я видел похожий вопрос здесь, но ответ не помогает (тем более ничего не говорит о коде в серверной части приложения).

Для пользовательского интерфейса я создал функции с именами header, sidebar и body, а затем просто пишу

ui <- dashboardPage(header(), sidebar(), body())

Это работает хорошо и по-прежнему работает, если функции header, sidebar и body должны иметь аргументы.

Для серверной части я не думаю, что подобная стратегия может быть применена. Мне интересно, можно ли написать «локальные» серверные функции (например, по одной на пункт меню), а затем объединить их в одну центральную серверную функцию.

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


person polmath    schedule 10.07.2015    source источник
comment
Этот вопрос, вероятно, следует удалить, поскольку он слишком общий. Ознакомьтесь с докладом о модуляризации блестящих приложений. Например, я только что написал функции, которые сократили мой app.R на сотни строк, но это не обязательно относится к вашему приложению. Но да, вы должны использовать source("HelperFunctions.R") внутри своего приложения.   -  person jrzelling    schedule 13.08.2016


Ответы (3)


Я не уверен, соответствует ли это вашим требованиям, вы можете создавать разные файлы и выполнять необходимые вычисления в этих файлах и сохранять все объекты (кадры данных или списки или буквально что-либо) в файл .Rds, используя saveRDS() в R, а затем загрузить этот файл в server.R, используя loadRDS(), в котором будут все ваши сохраненные объекты. Документацию можно найти здесь.

Затем просто используйте эти объекты, вызывая имена, как они были сохранены ранее. Большинство сложных приложений Shiny используют файл global.R (просто общее соглашение, вы можете использовать любое имя) для выполнения тяжелых вычислений и следуйте описанному выше подходу.

person Shiva    schedule 10.07.2015

Вы всегда можете использовать source для вызова других файлов R в server.R:

  1. Используйте source, как обычно в обычном R, вне каких-либо реактивных функций.

  2. Используйте source("xxxxx", local=T), когда вы хотите использовать его внутри реактивной функции, чтобы вызываемые вами коды r запускались каждый раз, когда активируется этот фрагмент реактивных кодов.

person Hao    schedule 13.07.2015

Для серверной части:

сервер.R:

library(shiny)
source('sub_server_functions.R')

function(input, output, session) {
    subServerFunction1(input, output, session)
    subServerFunction2(input, output, session)
    subServerFunction3(input, output, session) 
}

Это сработало для меня, возможно, вам нужно будет передать больше переменных функциям субсервера. Но объем реактивного вывода, по-видимому, позволяет это сделать.

sub_server_functions.R:

subserverfunction1 <- function(input, output, session) {
  output$checkboxGroupInput1 <- renderUI({
    checkboxGroupInput('test1','test1',choices = c(1,2,3))
 })
}

subserverfunction2 <- function(input, output, session) {
  output$checkboxGroupInput2 <- renderUI({
    checkboxGroupInput('test2','test2',choices = c(1,2,3))
 })
}

subserverfunction3 <- function(input, output, session) {
  output$checkboxGroupInput3 <- renderUI({
    checkboxGroupInput('test3','test3',choices = c(1,2,3))
 })
}
person Shape    schedule 07.11.2015