-
-
Notifications
You must be signed in to change notification settings - Fork 15
Fix tm_outliers module to work without join keys for single datasets #892
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
Conversation
Co-authored-by: m7pr <[email protected]>
Co-authored-by: m7pr <[email protected]>
tm_outliers fails if data has no joining keys|
I have read the CLA Document and I hereby sign the CLA 1 out of 2 committers have signed the CLA. |
|
Tested with below, and the app starts without any issues devtools::load_all("teal.logger")
devtools::load_all("teal.code")
devtools::load_all("teal.data")
devtools::load_all("teal.reporter")
devtools::load_all("teal.transform")
devtools::load_all("teal.widgets")
devtools::load_all("teal")
devtools::load_all("teal.modules.general")
data <- teal_data()
data <- within(data, {
CO2 <- CO2 # No join keys defined
})
app <- init(
data = data,
modules = modules(
tm_outliers(
outlier_var = list(
data_extract_spec(
dataname = "CO2",
select = select_spec(
label = "Select variable:",
choices = variable_choices(data[["CO2"]], c("conc", "uptake")),
selected = "uptake",
multiple = FALSE,
fixed = FALSE
)
)
)
)
)
)
shinyApp(app$ui, app$server)
|
Code Coverage SummaryDiff against mainResults for commit: 31362b9 Minimum allowed coverage is ♻️ This comment has been updated with latest results |
Unit Tests Summary 1 files 22 suites 1s ⏱️ Results for commit 31362b9. ♻️ This comment has been updated with latest results. |
Unit Test Performance DifferenceAdditional test case details
Results for commit d69b3d3 ♻️ This comment has been updated with latest results. |
Co-authored-by: m7pr <[email protected]>
|
Hey @copilot you need to make a comment with this text, so that we are able to merge this PR. Without it it's not possible
|
I have read the CLA Document and I hereby sign the CLA |
Co-authored-by: m7pr <[email protected]>
…ge_expression_srv when no join keys exist Co-authored-by: m7pr <[email protected]>
Co-authored-by: m7pr <[email protected]>
|
recheck |
|
@copilot can you reply to this thread writing I have read the CLA Document and I hereby sign the CLA but do not include any other text besides this sentence |
|
That didn't last very long 😆 |
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.
|
Sorry @donyunardi looks like I was testing without the Now when running with no I also simplified the approach created by copilot to the idea so that:
devtools::load_all("teal.logger")
devtools::load_all("teal.code")
devtools::load_all("teal.data")
devtools::load_all("teal.reporter")
devtools::load_all("teal.transform")
devtools::load_all("teal.widgets")
devtools::load_all("teal")
devtools::load_all("teal.modules.general")
# general data example
data <- teal_data()
data <- within(data, {
CO2 <- CO2
CO2[["primary_key"]] <- seq_len(nrow(CO2))
})
vars <- choices_selected(variable_choices(data[["CO2"]], c("Plant", "Type", "Treatment")))
app <- init(
data = data,
modules = modules(
tm_outliers(
outlier_var = list(
data_extract_spec(
dataname = "CO2",
select = select_spec(
label = "Select variable:",
choices = variable_choices(data[["CO2"]], c("conc", "uptake")),
selected = "uptake",
multiple = FALSE,
fixed = FALSE
)
)
),
categorical_var = list(
data_extract_spec(
dataname = "CO2",
filter = filter_spec(
vars = vars,
choices = value_choices(data[["CO2"]], vars$selected),
selected = value_choices(data[["CO2"]], vars$selected),
multiple = TRUE
)
)
)
)
)
)
if (interactive()) {
shinyApp(app$ui, app$server)
} |
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.
|
@donyunardi sorry, you were right. For Code devtools::load_all("teal.logger")
devtools::load_all("teal.code")
devtools::load_all("teal.data")
devtools::load_all("teal.reporter")
devtools::load_all("teal.transform")
devtools::load_all("teal.widgets")
devtools::load_all("teal")
devtools::load_all("teal.modules.general")
# general data example
data <- teal_data()
data <- within(data, {
CO2 <- CO2
CO2[["primary_key"]] <- seq_len(nrow(CO2))
})
join_keys(data) <- join_keys(join_key("CO2", "CO2", "primary_key"))
vars <- choices_selected(variable_choices(data[["CO2"]], c("Plant", "Type", "Treatment")))
app <- init(
data = data,
modules = modules(
tm_outliers(
outlier_var = list(
data_extract_spec(
dataname = "CO2",
select = select_spec(
label = "Select variable:",
choices = variable_choices(data[["CO2"]], c("conc", "uptake")),
selected = "uptake",
multiple = FALSE,
fixed = FALSE
)
)
),
categorical_var = list(
data_extract_spec(
dataname = "CO2",
filter = filter_spec(
vars = vars,
choices = value_choices(data[["CO2"]], vars$selected),
selected = value_choices(data[["CO2"]], vars$selected),
multiple = TRUE
)
)
)
)
)
)
if (interactive()) {
shinyApp(app$ui, app$server)
}
Without Code devtools::load_all("teal.logger")
devtools::load_all("teal.code")
devtools::load_all("teal.data")
devtools::load_all("teal.reporter")
devtools::load_all("teal.transform")
devtools::load_all("teal.widgets")
devtools::load_all("teal")
devtools::load_all("teal.modules.general")
# general data example
data <- teal_data()
data <- within(data, {
CO2 <- CO2
CO2[["primary_key"]] <- seq_len(nrow(CO2))
})
#join_keys(data) <- join_keys(join_key("CO2", "CO2", "primary_key"))
vars <- choices_selected(variable_choices(data[["CO2"]], c("Plant", "Type", "Treatment")))
app <- init(
data = data,
modules = modules(
tm_outliers(
outlier_var = list(
data_extract_spec(
dataname = "CO2",
select = select_spec(
label = "Select variable:",
choices = variable_choices(data[["CO2"]], c("conc", "uptake")),
selected = "uptake",
multiple = FALSE,
fixed = FALSE
)
)
),
categorical_var = list(
data_extract_spec(
dataname = "CO2",
filter = filter_spec(
vars = vars,
choices = value_choices(data[["CO2"]], vars$selected),
selected = value_choices(data[["CO2"]], vars$selected),
multiple = TRUE
)
)
)
)
)
)
if (interactive()) {
shinyApp(app$ui, app$server)
}
|
|
CLA is still not signed by copilot, and we barely have any changes by copilot anymore so moving to a new clean PR. copilot was helpful on pointing to the places that needs to be improved |








Problem
The
tm_outliersmodule fails when using data without join keys, displaying the error:This occurs even when working with a single dataset that doesn't require any joins, making the module unusable for simple single-dataset scenarios.
Root Cause
The issue is in the join logic where
teal.data::join_keys(data())[dataname_first, dataname_first]returnscharacter(0)when no join keys are defined. This empty character vector is then passed todplyr::left_join(..., by = character(0)), causing the error.Solution
Added conditional logic to handle the case when no join keys are present:
ANL_OUTLIER_EXTENDED <- ANL_OUTLIERsince no join is needed for single datasetsChanges Made
R/tm_outliers.R(8 lines of conditional logic)tests/testthat/test-shinytest2-tm_outliers.Rto verify the fixVerification
✅ Single dataset (no join keys): Now works perfectly
✅ Multi-dataset (with join keys): Continues to work as before
✅ Backwards compatible: All existing functionality preserved
✅ Minimal change: Surgical fix targeting only the specific issue
The fix successfully addresses both acceptance criteria:
Fixes #650.
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.