`builtin_handler_shiny` results in Error: attempt to apply non-function
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 45/100
Research direction
Start with R/progress-server.R around lines 356-365 and inspect the lifecycle of builtin_handler_shiny, especially complete(), set(), and output(). Reproduce the post-completion call sequence described in targets issue 1478; done means the shiny handler no longer raises a non-function error when progress operations occur after completion.
Written by the indexing model from the issue text.
Description
Dear cli maintainer, I recently encountered an issue https://github.com/ropensci/targets/issues/1478 (please check this issue for more detailed examples)
The targets package probably tried using cli progress bar before initialized ("add") or after completion, resulting in an error. The related code is here
https://github.com/r-lib/cli/blob/main/R/progress-server.R#L356C1-L365C5
We see that shiny progress is set to NULL, and then trying to access functions such as output or set will raise errors.
bar$shiny_progress <- NULL
Basically if shiny ends the progress bar builtin_handler_shiny$complete() and the program still tries to call builtin_handler_shiny $output(), then the code will error out in shiny app. However, the code works fine outside of shiny, which makes the debugging process extremely hard.
I understand that if the package is used super carefully, then this issue will not occur. However, it is often the case that the package does not mandate what people do, especially when the code just works for most of people. Considering that other handlers do not raise errors on "use-after-free", and condition that triggers this error, this inconsistency is super hard to debug/find.
However, could we add checks just to make sure the functions are not that stringent? Alternatively, if you would like to ensure consistent behavior, we can force set and output to result in errors after completion for other functions.
builtin_handler_shiny <- list(
able = function(bar, .envir) {
"shiny" %in% loadedNamespaces() && asNamespace("shiny")$isRunning()
},
add = function(bar, .envir) {
bar$shiny_progress <- asNamespace("shiny")$Progress$new(
asNamespace("shiny")$getDefaultReactiveDomain(),
min = 0,
max = bar$total
)
bar$shiny_progress$set(
message = bar$name %||% "",
detail = shiny_detail(bar, .envir)
)
},
set = function(bar, .envir) {
if(!is.null(bar$shiny_progress)) {
bar$shiny_progress$set(
value = bar$current,
detail = shiny_detail(bar, .envir)
)
}
},
complete = function(bar, .envir, results) {
if (!is.null(bar$shiny_progress)) {
bar$shiny_progress$set(
value = bar$current,
detail = shiny_detail(bar, .envir)
)
bar$shiny_progress$close()
}
bar$shiny_progress <- NULL
},
output = function(bar, .envir, text) {
bar$shiny_output <-
last_lines(paste0(bar$shiny_output, " \u2022 ", text))
if(!is.null(bar$shiny_progress)) {
bar$shiny_progress$set(
value = bar$current,
detail = shiny_detail(bar, .envir)
)
}
}
)
- Dominant language
- R
- Stars
- 730
- Forks
- 95
- Avg merge
- 1d 18h
- Merged PRs (30d)
- 4
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from r-lib/cli
-
C function cli_progress_sleep() is used in an example but not documented.Possibly taken @shreyabyte claimed this 50 days ago. Open
Difficulty 1/5 Under an hour Newbie friendliness 68/100
-
`pb_elapsed` should not show minutes & fractions of secondsPossibly taken @mcol claimed this 405 days ago. Openbug
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
-
Difficulty 4/5 3-5 days Newbie friendliness 42/100
-
feat: add `.duration` and `.time_ago` inline stylesPossibly taken A pull request linked to this issue is open or already merged. Openfeature
Difficulty 3/5 1-2 days Newbie friendliness 68/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 48/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
inbo/erl-butterflies-2025#26 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 67/100
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
RConsortium/submissions-pilot7-synthetic-data#95 ·
Maintainers usually reply within 1 day
-
betweenOpen
Difficulty 2/5 1-3 hours Newbie friendliness 65/100