1. freezeReactiveValue(input, "x") is called, inside a renderUI
or in an observer that then calls updateXXXInput
2. Some reactive output tries to access input$x, this takes a
reactive dependency but throws a (silent) error
3. When the flush cycle ends, it automatically thaws
What's *supposed* to happen next is the client receives the new
UI or updateXXXInput message, which causes input$x to change,
which causes the reactive output to invalidate and re-run, this
time without input$x being frozen.
This works, except when the renderUI or updateXXXInput just so
happens to set input$x to the same value it already is. In this
case, the client would detect the duplicate value and not send
it to the server. Therefore, the reactive output would not be
invalidated, and effectively be "stalled" until the next time it
is invalidated for some other reason.
With this change, freezeReactiveValue(input, "x") has a new side
effect, which is telling the client that the very next update to
input$x should not undergo duplicate checking.
1) In srcjs/input_rate.js line 284, the global variable `name` was
being written to.
2) In a couple of other places in that file, the global variable
`name` was being read instead of `nameType`--the result of an
incomplete refactor.
Also added an eslint rule to prevent this and other globals from
being read implicitly.
This was the product of a long discussion between @wch, @alandipert, @bborgesr
and myself. The conflation of immediate (no throttle/debounce) and non-dedupe
in a single "immediate" flag was deemed unacceptable, because UI controls often
want immediacy but also dedupe. Introducing a second "dedupe" flag would work
but {immediate: false, dedupe: false} doesn't make much sense, and dedupe not
only implies that InputNoResendDecorator should behave differently but also
InputBatchSender (i.e. no deduplication AND no coalescing).
We decided to remove the "immediate" boolean option and replace it with a
string option that would have three possibilities at this time. The only con
to this approach is if anyone is calling onInputChange with immediate:true
today, and I can't imagine anyone is. The immediate flag only has any effect
if the input id that's being set has been put in debounce/throttle mode, and
I don't even think that is documented today, and I'm not even sure it's
possible to do it from custom JS (that's not part of a custom input binding).
We already had an `immediate` input option, which was used to override client side rate
limiting mechanisms (debounce/throttle). This commit extends the semantics of that option
to also mean that duplicate values should not be ignored on the client side.
Previous to this commit, circumventing the client side dedupe logic was not enough. The
server side ReactiveValues object was also subject to deduping. With this commit, the
low-level ReactiveValues class's constructor now has a `dedupe` option, which defaults
to TRUE; the ReactiveValues used for a session's input has it turned to FALSE. I figure
if I had to work this hard to get the client to stop sending duplicates, and the input
values are only expected to ever be updated by the client, then there's really no reason
for server side deduping to be performed for this particular ReactiveValues object.
It would make sense as a future feature to also make deduping optional for user-created
reactiveValues and reactiveVal objects.
* Remove unused 'immediate' arguments
* Add opts argument to setInput methods
* Extract input values without opts
* Consistent interface for setting initial values
* Update NEWS
* Add binding and el when fileInputBinding triggers shiny:inputchanged
* Revert "Consistent interface for setting initial values"
This reverts commit 12c0b6e72a.
* Move InputDeferDecorater function
The new placement properly reflects the decorator stack
* Fix indentation
* bindInputs: make sure value is set immediately
* Only use opts where necessary in input decorators
* Properly send initial values
* Move initial value of .clientdata_allowDataUriScheme to better place
* Fix indentation
* Add InputValidateDecorator
* Better variable name
* Add function for default input options
* Simplify code