Skip to content

Commit 173b3dd

Browse files
committed
fix warn for env and code in extract
1 parent 140ed13 commit 173b3dd

File tree

3 files changed

+38
-23
lines changed

3 files changed

+38
-23
lines changed

R/qenv-extract.R

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,34 @@
1919
`[.qenv` <- function(x, names, ...) {
2020
checkmate::assert_class(names, "character")
2121
possible_names <- ls(get_env(x), all.names = TRUE)
22-
names_warn <- setdiff(names, possible_names)
23-
names <- intersect(names, possible_names)
24-
if (!length(names)) {
25-
warning(
26-
sprintf(
27-
"None of 'names' elements exist in '%s'. Returning empty '%s'.",
28-
class(x)[1],
29-
class(x)[1]
22+
names_corrected <- intersect(names, possible_names)
23+
env <- if (length(names_corrected)) {
24+
names_missing <- setdiff(names, possible_names)
25+
if (length(names_missing)) {
26+
warning(
27+
sprintf(
28+
"Some elements of 'names' do not exist in the environment of the '%s'. Skipping those: %s.",
29+
class(x)[1],
30+
paste(names_missing, collapse = ", ")
31+
)
3032
)
31-
)
32-
return(qenv())
33-
}
34-
35-
if (length(names_warn)) {
33+
}
34+
list2env(as.list(x, all.names = TRUE)[names_corrected], parent = parent.env(.GlobalEnv))
35+
} else {
3636
warning(
3737
sprintf(
38-
"Some elements of 'names' do not exist in '%s'. Skipping those: %s.",
39-
class(x)[1],
40-
paste(names_warn, collapse = ", ")
41-
)
38+
"None of 'names' exist in the environment of the '%1$s'. Returning empty '%1$s'.",
39+
class(x)[1]
40+
),
41+
call. = FALSE
4242
)
43+
new.env(parent = parent.env(.GlobalEnv))
4344
}
45+
lockEnvironment(env)
46+
x@.xData <- env
4447

45-
x@.xData <- list2env(as.list(x, all.names = TRUE)[names])
46-
names <- gsub("^`(.*)`$", "\\1", names)
47-
x@code <- get_code_dependency(x@code, names = names, ...)
48+
normalized_names <- gsub("^`(.*)`$", "\\1", names)
49+
x@code <- get_code_dependency(x@code, names = normalized_names, ...)
4850

4951
x
5052
}

R/utils-get_code_dependency.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ get_code_dependency <- function(code, names, check_names = TRUE) {
3838
}))
3939

4040
if (!all(names %in% unique(symbols))) {
41-
warning("Object(s) not found in code: ", toString(setdiff(names, symbols)))
41+
warning("Object(s) not found in code: ", toString(setdiff(names, symbols)), call. = FALSE)
4242
}
4343
}
4444

tests/testthat/test-qenv_extract.R

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ testthat::test_that("`[.` returns empty qenv for names not in qenv", {
55
})
66
testthat::expect_warning(
77
testthat::expect_equal(data["y"], qenv()),
8-
"None of 'names' elements exist in 'qenv'. Returning empty 'qenv'."
8+
"None of 'names' exist in the environment of the 'qenv'. Returning empty 'qenv."
99
)
1010
})
1111

@@ -16,10 +16,23 @@ testthat::test_that("`[.` returns limited qenv for some names not in qenv", {
1616
})
1717
testthat::expect_warning(
1818
testthat::expect_equal(data[c("y", "a")], data["a"]),
19-
"Some elements of 'names' do not exist in 'qenv'. Skipping those: y."
19+
"Some elements of 'names' do not exist in the environment of the 'qenv'. Skipping those: y."
2020
)
2121
})
2222

23+
testthat::test_that("`[.` limits code for some names not in code", {
24+
data <- within(qenv(), {
25+
x <- 1
26+
a <- 2
27+
rm(x)
28+
})
29+
testthat::expect_warning(
30+
testthat::expect_equal(data[c("a", "x")], data["a"]),
31+
"Some elements of 'names' do not exist in the environment of the 'qenv'. Skipping those: x."
32+
)
33+
})
34+
35+
2336
testthat::test_that("`[.` subsets environment and code to specified object names", {
2437
q <- qenv()
2538
code <- c("x<-1", "a<-1;b<-2")

0 commit comments

Comments
 (0)