-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.R
168 lines (161 loc) · 5.47 KB
/
app.R
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# Know yourself.
# shiny app created by
# atilaorlov@gmail.com
# Conocete a ti mismo
# análisis de palabras más usadas en tus posts de facebook
##########
#########
# cargando la librería requeridas
require(stringr)
require(shiny)
require(htmlwidgets)
require(webshot)
require(rjson)
require(magrittr)
require(tidytext)
require(dplyr)
require(tm)
require(wordcloud2) # installed from git remotes::install_github("lchiffon/wordcloud2") to solve not downloading png/pdf
require(readr)
require(data.table)
require(shinyWidgets)
require(r2social)
# cargando script de funciones
source("functions.R")
webshot::install_phantomjs() # necesario para shiny io
webshot:::find_phantom()
## USER INTERFACE
################
ui <- fluidPage(
theme = bslib::bs_theme(version = 5, bootswatch = "minty"),
r2social.scripts(),
shareButton(link = "https://atilaorlov.shinyapps.io/conoCT/", position = "right"),
setBackgroundImage(
src = "https://images.unsplash.com/photo-1511933801659-156d99ebea3e?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=987&q=80"
),
#### directiva javascript para manejar clic. Hallé rutas CSS requeridas Inpeccionando página.
tags$script(
HTML(
"$(document).on('click', '#wordcloud', function() {
word = $('#wordcloudwcLabel').text();
Shiny.onInputChange('clicked_word', word);
});"
)
),
####
titlePanel(title =
tags$a(href='https://atilaorlov.shinyapps.io/conoCT/',
icon("ice-cream"),
'conoCT'),
windowTitle = "conoCT"),
sidebarLayout(
# Panel de herramientas (input e instructivo)
sidebarPanel(
p(
"Explora las palabras que más utilizas dentro de tus publicaciones de facebook."
),
fileInput(
"Json",
"Elige el archivo Json de tus publicaciones",
multiple = FALSE,
accept = c(".json")
),
# min y max word deberá ser dinámico, al menos el máx.
# min puede ser 1 para cubrir casos extremos
# max deberá ser nrow(wordcounts)
# que se calcula una vez leído el archivo
### así que session, ahí vamos
sliderInput("n_word", "Número de palabras", 1, 2, value = 1, step = 1),
h1("Instrucciones:"),
h2("1. Carga tu archivo .json"),
p("Lo puedes descargar desde el siguiente enlace:"),
a(
"https://www.facebook.com/dyi/",
href = "https://www.facebook.com/dyi/",
target = "_blank"
),
p(
"Basta que elijas la casilla de tus posts. Elige el rango de tiempo que desees."
),
p(
"Si tienes dudas mira este video instructivo de más de 1 minuto en mi canal de Youtube"
),
tags$a(href="https://youtu.be/xKU9_72vXzc", icon("youtube"), "Video Instructivo - +1 minuto", target="_blank"),
h2("2. Interactúa con tu nube"),
p(
"Puedes dar clic en cualquier palabra para conocer los posts en donde las usaste."
),
h2("3. Descarga tu nube"),
p(
"Puedes descargarla como una imagen utilizando el botón descargar."
),
h2("4. Comparte"),
p(
"¡Publica tu nube e invita a tus amigos a conocerse compartiendo el enlace de esta página!"
),
hr(),
p("Esta aplicación es de código abierto. No recauda absolutamente ninguno de tus datos."),
p("Puedes consultar el código fuente aquí"),
tags$a(href="https://github.com/atilaorlov/conoCT", icon("github"), "Código Fuente", target="_blank")
),
# panel de outputs
mainPanel(
div(
wordcloud2Output("wordcloud", height = "700px"),
downloadButton(outputId = "savecloud"),
tableOutput("filtered_tbl"),
style = "background-color:#ADD8E6;"
)
)
)
)
server <- function(input, output, session) {
tu_nube <- 0 # la intención era descargar la misma nube
# pero por alguna razón no funciona.
df <- reactive({
req(input$Json)
tryCatch(
expr = crear_df_nube(input$Json$datapath), # ruta de archivo temporal
error = function(e){
message('Atrapé un error!')
print(e)
},
warning = function(w){
message('Atrapé una advertencia!')
print(w)
},
finally = {
message('Todo listo, me voy.')
}
)
})
output$wordcloud <- renderWordcloud2({
tu_nube <<- crear_nube(df(), input$n_word)
})
output$savecloud <- downloadHandler(
filename = paste0("wordcloud", '.png'),
content = function(file) {
owd <- setwd(tempdir())
on.exit(setwd(owd))
saveWidget(tu_nube, "tmp.html", selfcontained = FALSE)
webshot("tmp.html", file, delay = 3)
}
)
filtered_comment <- reactive({
req(input$clicked_word)
clicked_word <-
str_remove(input$clicked_word, ":[0-9]+$") # quitar símbolos y números a elemento cliqueado.
df() %>%
filter(str_detect(tolower(post_clean), paste0("\\b", clicked_word, "\\b"))) %>% # filtrar palabras no sub-strings. El artículo de ayuda tiene error aquí
select(post) # versión de muestra solo selecciona la columna post. Implementar muestra fechas.
})
output$filtered_tbl = renderTable(filtered_comment())
## hace dinamico el slider dependiente del número de palabras leídas en json
observe({
n_word <- nrow(df())
# el numero de vueltas permitido es igual al numero de observaciones menos uno
# se observo que tiene un comportamiento modular modulo (val-1)
updateSliderInput(session, "n_word", max = n_word)
})
}
shinyApp(ui, server)