When to use reactiveValuesToList?


#1

Hi, everyone! I just ran across the reactiveValuesToList function and was curious - why and when would we want to use this? Isn't a reactiveValues object already a list?


#2

A reactiveValues object is not a list. It looks like a list from the point of view of accessing it, but its structure is more complex. And it is reactive, we cannot access its values outside of a reactive domain (defined by Shiny).

Imagine a dashboard where there are very many settings for an output. The output does not update each time when you modify one of these settings but only when you press a button (e.g., it is an expensive computation, a PDF report, etc.). When you call the expensive computation function, you can pass the arguments with

    result <- expensive_calculation(a = input$a, b = input$b, ......)

After 7-8 of arguments this is no longer fun. A quicker solution is

    result <- do.call(expensive_calculation, reactiveValuesToList(input))

Plus you do not need to update the code each time you add a new setting on the dashboard.


#3

Ah, okay, got it. I went ahead and tried your example on something simple.

rv <- reactiveValues(a = 1, b = 2)
isolate(do.call("paste", rv))

This gave me the error

Error in as.vector(x, "character") : 
  cannot coerce type 'environment' to vector of type 'character'

All worked well though if I did the following (as you suggest):

isolate(do.call("paste", reactiveValuesToList(rv)))

which gave

[1] "1 2"

P.S. I was using isolate as I was playing in the Console outside of a reactive context.

My original thinking was "if it looks like a duck and acts like a duck, then it's a duck!", where duck = list of course. It appears that a reactiveValues object is indeed not really a duck, er, list.

Thanks!