Apesar de ler muitos tutoriais, ainda não está claro para mim o que está sendo passado de volta de uma reactive
expressão/bloco de código, especialmente quando os blocos de código dentro dele reactive
se tornam maiores. Fiz alguns testes básicos, assumindo que reactiveConsole(TRUE)
é uma maneira adequada de testar essas coisas.
O resumo a seguir é preciso?
- sem uma declaração explícita
return
,reactive
sempre retorna o valor produzido pela última declaração dentro de sua expressão, independentemente de esse valor ter sido atribuído a uma variável local (mas veja o comportamento "inesperado" nos exemplos abaixo) - use
return
instruções explícitas para evitar retornar o resultado da instrução final, por exemplo, para evitar retornar umaprint
instrução de depuração no final da expressão, para criar uma lógica if/else sobre o que retornar, etc.
Se houver outras variações importantes ou exceções a esse comportamento que valham a pena mencionar, por favor, faça-o.
library(shiny)
reactiveConsole(TRUE)
#------single line-----
#direct assignment
x = reactive({5})
x() #-> 5
ans = x()
ans #-> 5
#assign value to local variable, return
x = reactive({tmp = 5
return(tmp)})
x() #-> 5
ans = x()
ans #-> 5
#assign value to local variable, don't return
x = reactive({tmp = 5})
x() #-> [no response]
ans = x()
ans #-> 5 [value unexpectedly returns]
#-----multi-line---
#direct assignment: final line is retained
x = reactive({5
10})
x() #-> 10
ans = x()
ans #-> 10
#return requested local var, tmp
x = reactive({tmp = 5
tmp2 = 10
return(tmp)})
x() #-> 5
ans = x()
ans #-> 5
#return requested local var, tmp2
x = reactive({tmp = 5
tmp2=10
return(tmp2)})
x() #-> 10
ans = x()
ans #-> 10
#without return
x = reactive({tmp = 5
tmp2 = 10})
x() #-> [no response]
ans = x()
ans #-> 10 [value unexpectedly returns]