@@ -438,16 +438,31 @@ srv_outliers <- function(id, data, reporter, filter_panel_api, outlier_var,
438438 }
439439 })
440440
441+ # Used to create outlier table and the dropdown with additional columns
442+ dataname_first <- isolate(names(data())[[1 ]])
443+
444+ data_obj <- reactive({
445+ obj <- data()
446+ if (length(teal.data :: join_keys(obj )) == 0 ) {
447+ if (! " .row_id" %in% names(obj [[dataname_first ]])) {
448+ obj [[dataname_first ]]$ .row_id <- seq_len(nrow(obj [[dataname_first ]]))
449+ }
450+ teal.data :: join_keys(obj ) <-
451+ teal.data :: join_keys(teal.data :: join_key(dataname_first , dataname_first , " .row_id" ))
452+ }
453+ obj
454+ })
455+
441456 anl_merged_input <- teal.transform :: merge_expression_srv(
442457 selector_list = reactive_select_input ,
443- datasets = data ,
458+ datasets = data_obj ,
444459 merge_function = " dplyr::inner_join"
445460 )
446461
447462 anl_merged_q <- reactive({
448463 req(anl_merged_input())
449464 teal.code :: eval_code(
450- data (),
465+ data_obj (),
451466 paste0(
452467 ' library("dplyr");library("tidyr");' , # nolint quotes
453468 ' library("tibble");library("ggplot2");'
@@ -468,9 +483,6 @@ srv_outliers <- function(id, data, reporter, filter_panel_api, outlier_var,
468483 sum(is.na(ANL [[outlier_var ]]))
469484 })
470485
471- # Used to create outlier table and the dropdown with additional columns
472- dataname_first <- isolate(names(data())[[1 ]])
473-
474486 common_code_q <- reactive({
475487 req(iv_r()$ is_valid())
476488
@@ -616,25 +628,33 @@ srv_outliers <- function(id, data, reporter, filter_panel_api, outlier_var,
616628 )
617629
618630 # ANL_OUTLIER_EXTENDED is the base table
619- qenv <- teal.code :: eval_code(
620- qenv ,
621- substitute(
622- expr = {
623- ANL_OUTLIER_EXTENDED <- dplyr :: left_join(
624- ANL_OUTLIER ,
625- dplyr :: select(
626- dataname ,
627- dplyr :: setdiff(names(dataname ), dplyr :: setdiff(names(ANL_OUTLIER ), join_keys ))
628- ),
629- by = join_keys
631+ join_keys <- as.character(teal.data :: join_keys(data_obj())[dataname_first , dataname_first ])
632+
633+ if (length(join_keys ) == 1 && join_keys == " .row_id" ) {
634+ # Dummy join key - single dataset, no join needed
635+ qenv <- teal.code :: eval_code(qenv , quote(ANL_OUTLIER_EXTENDED <- ANL_OUTLIER ))
636+ } else {
637+ # Join keys exist - perform left join
638+ qenv <- teal.code :: eval_code(
639+ qenv ,
640+ substitute(
641+ expr = {
642+ ANL_OUTLIER_EXTENDED <- dplyr :: left_join(
643+ ANL_OUTLIER ,
644+ dplyr :: select(
645+ dataname ,
646+ dplyr :: setdiff(names(dataname ), dplyr :: setdiff(names(ANL_OUTLIER ), join_keys ))
647+ ),
648+ by = join_keys
649+ )
650+ },
651+ env = list (
652+ dataname = as.name(dataname_first ),
653+ join_keys = join_keys
630654 )
631- },
632- env = list (
633- dataname = as.name(dataname_first ),
634- join_keys = as.character(teal.data :: join_keys(data())[dataname_first , dataname_first ])
635655 )
636656 )
637- )
657+ }
638658
639659 qenv <- if (length(categorical_var ) > 0 ) {
640660 qenv <- teal.code :: eval_code(
@@ -1150,7 +1170,7 @@ srv_outliers <- function(id, data, reporter, filter_panel_api, outlier_var,
11501170 brushing = TRUE
11511171 )
11521172
1153- choices <- reactive(teal.transform :: variable_choices(data ()[[dataname_first ]]))
1173+ choices <- reactive(teal.transform :: variable_choices(data_obj ()[[dataname_first ]]))
11541174
11551175 observeEvent(common_code_q(), {
11561176 ANL_OUTLIER <- common_code_q()[[" ANL_OUTLIER" ]]
0 commit comments