Skip to content

Commit

Permalink
Allow non-standard datanames in teal .raw_data (#1382)
Browse files Browse the repository at this point in the history
wip

# Pull Request

<!--- Replace `#nnn` with your issue link for reference. -->

Fixes #1366

### Related:

- #1382
- insightsengineering/teal.slice#622
- insightsengineering/teal.data#340

### Changes description

- `.raw_data` is created and supports non-standard R names, such as:
  - `%pipe%`
  - `assigns<-`
  - ...
  • Loading branch information
averissimo authored Oct 25, 2024
1 parent a1087d2 commit 147eef3
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 1 deletion.
2 changes: 1 addition & 1 deletion R/module_filter_data.R
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ srv_filter_data <- function(id, datasets, active_datanames, data_rv, is_active)
data,
paste0(
".raw_data <- list2env(list(",
toString(sprintf("%1$s = %1$s", datanames)),
toString(sprintf("%1$s = %1$s", sapply(datanames, as.name))),
"))\n",
"lockEnvironment(.raw_data) #@linksto .raw_data" # this is environment and it is shared by qenvs. CAN'T MODIFY!
)
Expand Down
105 changes: 105 additions & 0 deletions tests/testthat/test-module_teal.R
Original file line number Diff line number Diff line change
Expand Up @@ -2216,3 +2216,108 @@ testthat::describe("srv_teal snapshot manager", {
)
})
})

testthat::describe("Datanames with special symbols", {
testthat::it("are detected as datanames when defined as 'all'", {
shiny::testServer(
app = srv_teal,
args = list(
id = "test",
data = teal.data::teal_data(
iris = iris,
`%a_pipe%` = function(lhs, rhs) paste(lhs, rhs)
),
modules = modules(module("module_1", server = function(id, data) data)),
filter = teal_slices(
module_specific = TRUE
)
),
expr = {
session$setInputs("teal_modules-active_tab" = "module_1")
session$flushReact()

testthat::expect_setequal(
ls(
teal.code::get_env(modules_output$module_1()()),
all.names = TRUE
),
c(".raw_data", "iris", "%a_pipe%")
)
}
)
})

testthat::it("are present in datanames when used in pre-processing code", {
shiny::testServer(
app = srv_teal,
args = list(
id = "test",
data = within(
teal.data::teal_data(),
{
iris <- iris
mtcars <- mtcars
`_a variable with spaces_` <- "new_column" # nolint: object_name.
iris <- cbind(iris, data.frame(`_a variable with spaces_`))
}
),
modules = modules(
module("module_1", server = function(id, data) data, datanames = c("iris", "_a variable with spaces_"))
)
),
expr = {
session$setInputs("teal_modules-active_tab" = "module_1")
session$flushReact()
testthat::expect_setequal(
ls(
teal.code::get_env(modules_output$module_1()()),
all.names = TRUE
),
c(".raw_data", "iris", "_a variable with spaces_")
)
}
)
})

testthat::it("(when used as non-native pipe) are present in datanames in the pre-processing code", {
testthat::expect_warning(
shiny::testServer(
app = srv_teal,
args = list(
id = "test",
data = within(
teal.data::teal_data(),
{
iris <- iris
mtcars <- mtcars
`%cbind%` <- function(lhs, rhs) cbind(lhs, rhs)
iris <- iris %cbind% data.frame("new_column")
}
),
modules = modules(
module("module_1", server = function(id, data) data, , datanames = c("iris"))
),
filter = teal_slices(
module_specific = TRUE
)
),
expr = {
session$setInputs("teal_modules-active_tab" = "module_1")
session$flushReact()

testthat::expect_contains(
strsplit(
x = teal.code::get_code(modules_output$module_1()()),
split = "\n"
)[[1]],
c(
"`%cbind%` <- function(lhs, rhs) cbind(lhs, rhs)",
".raw_data <- list2env(list(iris = iris))"
)
)
}
),
"'package:teal' may not be available when loading"
)
})
})

0 comments on commit 147eef3

Please sign in to comment.