-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Attempt to fix Result block don't get updated properly #432 #435
base: main
Are you sure you want to change the base?
Changes from 3 commits
a9330aa
6f67cb5
38a2f60
b4d605a
8260e59
c03f1d5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -44,13 +44,19 @@ generate_server.result_field <- function(x, ...) { | |||||||||||||||||||||||||||||||
updateSelectInput( | ||||||||||||||||||||||||||||||||
session, | ||||||||||||||||||||||||||||||||
"select-stack", | ||||||||||||||||||||||||||||||||
choices = result_field_stack_opts(session$ns, workspace_stacks()), | ||||||||||||||||||||||||||||||||
choices = result_field_stack_opts(session$ns, names(workspace_stacks())), | ||||||||||||||||||||||||||||||||
selected = input[["select-stack"]] | ||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
reactive({ | ||||||||||||||||||||||||||||||||
get_result(input[["select-stack"]]) | ||||||||||||||||||||||||||||||||
req(input[["select-stack"]]) | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is needed now as this expression takes dependencies on other reactive element. Avoids to subset when input$select-stack is NULL. |
||||||||||||||||||||||||||||||||
stacks <- workspace_stacks() | ||||||||||||||||||||||||||||||||
blocks <- stacks[[input[["select-stack"]]]]$blocks | ||||||||||||||||||||||||||||||||
all_valid <- lgl_ply(blocks, \(block) { | ||||||||||||||||||||||||||||||||
block$is_valid() | ||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
if (all(all_valid) == TRUE) get_result(input[["select-stack"]]) else data.frame() | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Overall, we check that the previous stack is valid (otherwise the result block has no way to know about the previous blocks from the linked stack). Note: this will be superseded in the stack validation PR #427. |
||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
@@ -159,6 +165,7 @@ generate_server_block <- function( | |||||||||||||||||||||||||||||||
obs$update_blk <- observeEvent(c(r_values(), in_dat(), is_prev_valid()), | ||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||
# 1. upd blk, | ||||||||||||||||||||||||||||||||
is_valid$block <- FALSE | ||||||||||||||||||||||||||||||||
b <- update_blk( | ||||||||||||||||||||||||||||||||
b = blk(), | ||||||||||||||||||||||||||||||||
value = r_values(), | ||||||||||||||||||||||||||||||||
|
@@ -210,7 +217,7 @@ generate_server_block <- function( | |||||||||||||||||||||||||||||||
out_dat <- if (attr(x, "submit") > -1) { | ||||||||||||||||||||||||||||||||
eventReactive(input$submit, | ||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||
req(is_valid$block) | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. req was blocking the reactive chain. We just return an empty data.frame if invalid. |
||||||||||||||||||||||||||||||||
if (!is_valid$block) return(data.frame()) | ||||||||||||||||||||||||||||||||
if (is.null(in_dat())) { | ||||||||||||||||||||||||||||||||
evaluate_block(blk()) | ||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||
|
@@ -223,10 +230,11 @@ generate_server_block <- function( | |||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||
reactive({ | ||||||||||||||||||||||||||||||||
req(is_valid$block) | ||||||||||||||||||||||||||||||||
if (!is_valid$block) return(data.frame()) | ||||||||||||||||||||||||||||||||
if (is.null(in_dat()) && !inherits(x, "transform_block")) { | ||||||||||||||||||||||||||||||||
evaluate_block(blk()) | ||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||
if (nrow(in_dat()) == 0 && !inherits(x, "parser_block")) return(data.frame()) | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I actually replaced this by: if (inherits(in_dat(), "data.frame") && nrow(in_dat()) == 0) {
return(data.frame())
} as it broke the plots. |
||||||||||||||||||||||||||||||||
evaluate_block(blk(), data = in_dat()) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
|
@@ -396,10 +404,15 @@ generate_server.stack <- function(x, id = NULL, new_block = NULL, | |||||||||||||||||||||||||||||||
# Any block change: data or input should be sent | ||||||||||||||||||||||||||||||||
# up to the stack so we can properly serialise. | ||||||||||||||||||||||||||||||||
observeEvent( | ||||||||||||||||||||||||||||||||
c( | ||||||||||||||||||||||||||||||||
get_block_vals(vals$blocks), | ||||||||||||||||||||||||||||||||
get_last_block_data(vals$blocks)() | ||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||
lapply(vals$blocks, \(block) { | ||||||||||||||||||||||||||||||||
req(block) | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. a little extra check to prevent this event from triggering when vals$block is a list of NULL elements. |
||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
c( | ||||||||||||||||||||||||||||||||
get_block_vals(vals$blocks), | ||||||||||||||||||||||||||||||||
get_last_block_data(vals$blocks)() | ||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||
vals$stack <- set_stack_blocks( | ||||||||||||||||||||||||||||||||
vals$stack, | ||||||||||||||||||||||||||||||||
|
@@ -702,9 +715,17 @@ generate_server.workspace <- function(x, id, ...) { | |||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
attr(x, "reactive_stack_directory") <- reactive({ | ||||||||||||||||||||||||||||||||
names(vals$stacks) | ||||||||||||||||||||||||||||||||
vals$stacks | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We need to pass the stacks to do further check within the result field server logic. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just for my understanding: why do we need to pass through the entire stacks here? Initially the intention for the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see, it is the validity check for the dependent stack that this is used for. If this is the chase, the result field validator should take care of this, no? Can we extend Lines 298 to 312 in 061ac78
to not only check for existence of a stack, but also it's "validity"? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I played around this idea in 5822c89. However, while it works well for a "static" case, that is, with predefined stacks, it fails in the dynamic case when block are added on the fly: # works
serve_workspace(
stack1 = new_stack(new_dataset_block("BOD"), new_select_block()),
stack2 = new_stack(new_result_block("stack1"))
)
# fails: to replicate, add a new_select_block on the fly and nothing happens.
serve_workspace(
stack1 = new_stack(new_dataset_block("BOD")),
stack2 = new_stack(new_result_block("stack1"))
) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Actually this just does not work. My workspace was already contaminated by other existing stacks so I though it worked but no ... |
||||||||||||||||||||||||||||||||
}) |> bindEvent( | ||||||||||||||||||||||||||||||||
chr_ply(lapply(vals$stacks, `[[`, "stack"), attr, "title") | ||||||||||||||||||||||||||||||||
c( | ||||||||||||||||||||||||||||||||
chr_ply(lapply(vals$stacks, `[[`, "stack"), attr, "title"), | ||||||||||||||||||||||||||||||||
lapply(vals$stack, \(stack) { | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. added an extra trigger each time a block changes and it's validity change, otherwise the result field does not update consistently. |
||||||||||||||||||||||||||||||||
lgl_ply(stack$blocks, \(block) { | ||||||||||||||||||||||||||||||||
block$is_valid() | ||||||||||||||||||||||||||||||||
block$block | ||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
# Serialize | ||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since we pass the entire stack object in the
reactive_stack_directory
, we just extract the names to display them in the select choices.