In ben geconfronteerd met een R-Shiny webapplicatie. Een omgeving die nieuw voor me is. Nu loop ik tegen het volgende aan en vraag me af hoe jullie hier tegenaan kijken?
Een deel van deze applicatie betreft een soort gastenboek. Je hebt dus een lijst reacties, en een eerste, vorige, volgende en laatste knop. Ook is er een veld dat aangeeft op welke pagina je zit.
In de applicatie is dit nu geprogrammeerd dat bij het openen van de reacties 6 keer alle reacties uit de database worden opgehaald. Een keer voor alle knoppen te bedienen (zijn ze wel of niet actief) en een keer voor het daadwerkelijk tonen van de reacties.
Nu ben ik aan het kijken hoe je dit nu anders zou kunnen aanpakken vanuit mijn ervaring met MVC en specifiek andere frameworks zoals Angular.
Het nadeel van R-Shiny is volgens mij echter dat het niet met expliciete controllers werkt. Het is niet makkelijk om data over meerdere GUI elementen te gelijk te delen.
Nu heb ik een opzet uitgewerkt die in de buurt van een controller komt zodat ik de interactie tussen GUI elementen beter kan compartimenteren in modules, pagina's modulair kan opzetten op basis van die compartimenten en ook efficiënt de communicatie tussen pagina's mogelijk maak.
Nu is alles aan alles geknoopt zonder enige vorm van modulariteit.
Ik vraag me af of wat ik probeer te bereiken niet veel makkelijker kan en of er niet best practices zijn die ik nog niet gevonden had. De zoekterm R-Shiny MVC levert echter maar weinig zinnige reacties op.
Als ik nu op schakelaar 1 druk dan schakelt alleen schakelaar 1. Als ik op schakelaar 2 druk dan schakelen beide schakelaars.
Voordelen van deze aanpak:
- Mijn caches zitten nu in een local scope en zijn te gebruiken voor alle UI elementen binnen mijn compartiment.
- Ik kan modulair mijn pagina's en compartimenten opbouwen met hun eigen scopes en vooraf gedefinieerde acties. Dat maakt het makkelijker om het geheel modulair te maken en te ontkoppelen.
- Het is vrij makkelijk te documenteren.
- Communicatie tussen pagina's zou op dezelfde manier kunnen worden vormgegeven zoals nu tussen mijn blokken.
- Angular 'services' zijn mogelijk door in mijn global scope een reactiveValues object te maken.
Uitdaging:
- Grootste uitdaging is nu om ook de ui van de app modulair te maken en mee te laten lopen met mijn controllers.
Ik hoop dat ik het een beetje helder heb kunnen toelichten, want R(-shiny) is niet echt mijn domein
Een deel van deze applicatie betreft een soort gastenboek. Je hebt dus een lijst reacties, en een eerste, vorige, volgende en laatste knop. Ook is er een veld dat aangeeft op welke pagina je zit.
In de applicatie is dit nu geprogrammeerd dat bij het openen van de reacties 6 keer alle reacties uit de database worden opgehaald. Een keer voor alle knoppen te bedienen (zijn ze wel of niet actief) en een keer voor het daadwerkelijk tonen van de reacties.
Nu ben ik aan het kijken hoe je dit nu anders zou kunnen aanpakken vanuit mijn ervaring met MVC en specifiek andere frameworks zoals Angular.
Het nadeel van R-Shiny is volgens mij echter dat het niet met expliciete controllers werkt. Het is niet makkelijk om data over meerdere GUI elementen te gelijk te delen.
Nu heb ik een opzet uitgewerkt die in de buurt van een controller komt zodat ik de interactie tussen GUI elementen beter kan compartimenteren in modules, pagina's modulair kan opzetten op basis van die compartimenten en ook efficiënt de communicatie tussen pagina's mogelijk maak.
Nu is alles aan alles geknoopt zonder enige vorm van modulariteit.
Ik vraag me af of wat ik probeer te bereiken niet veel makkelijker kan en of er niet best practices zijn die ik nog niet gevonden had. De zoekterm R-Shiny MVC levert echter maar weinig zinnige reacties op.
S:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
| library(shiny) service <- reactiveValues(); ui <- fluidPage( fluidRow( column(3, h3("Schakelaar 1"), actionButton("action1", "on") ), column(3, h3("Schakelaar 2"), actionButton("action2", "on") ) ) ) blok1 <- function(input, output, session, acties) { values <- reactiveValues(status = 1); updateButton <- function() { if(valus$status == 0) { updateActionButton(session, "action1", "on"); values$status <- 1; } else { updateActionButton(session, "action1", "off"); values$status <- 0; } acties$blok1 = -1; observeEvent(input$action1, { updateButton(); }); observeEvent(acties$blok1, { updateButton(); }) } } blok2 <- function(input, output, session, acties) { values <- reactiveValues(status = 1); observeEvent(input$action2, { if(valus$status == 0) { updateActionButton(session, "action2", "on"); values$status <- 1; } else { updateActionButton(session, "action2", "off"); values$status <- 0; } if(!is.null(acties$blok1)) { acties$blok1 <- acties$blok1 + 1; } }); } pagina <- function(input, output, session) { acties <- reactiveValues(); blok1(input, output, session, acties); blok2(input, output, session, acties); } server <- function(input, output, session) { pagina(input, output, session); } shinyApp(ui = ui, server = server); |
Als ik nu op schakelaar 1 druk dan schakelt alleen schakelaar 1. Als ik op schakelaar 2 druk dan schakelen beide schakelaars.
Voordelen van deze aanpak:
- Mijn caches zitten nu in een local scope en zijn te gebruiken voor alle UI elementen binnen mijn compartiment.
- Ik kan modulair mijn pagina's en compartimenten opbouwen met hun eigen scopes en vooraf gedefinieerde acties. Dat maakt het makkelijker om het geheel modulair te maken en te ontkoppelen.
- Het is vrij makkelijk te documenteren.
- Communicatie tussen pagina's zou op dezelfde manier kunnen worden vormgegeven zoals nu tussen mijn blokken.
- Angular 'services' zijn mogelijk door in mijn global scope een reactiveValues object te maken.
Uitdaging:
- Grootste uitdaging is nu om ook de ui van de app modulair te maken en mee te laten lopen met mijn controllers.
Ik hoop dat ik het een beetje helder heb kunnen toelichten, want R(-shiny) is niet echt mijn domein
Sinds de 2 dagen regel reageer ik hier niet meer