有谁知道为什么下面的方法不起作用吗?好像stringr::str_glue()
找不到file_name
参数,因为它在purrr::map()
里面。我怎么才能解决这个问题?
library(tidyverse)
fn_render_ce_template <- function(
template,
file_name,
early_billing_cycle = NA,
late_billing_cycle = NA,
early_price = NA,
late_price = NA,
price_dollars = NA,
price_cents = NA,
year = NA
){
template %>%
map_chr(str_glue) %>%
str_squish()
}
# this doesn't work
fn_render_ce_template(
template = c('{file_name}_1', '{file_name}_2'),
file_name = 'test'
)
#> Error:
#> i In index: 1.
#> Caused by error:
#> ! object 'file_name' not found
#> Backtrace:
#> x
#> 1. +-global fn_render_ce_template(...)
#> 2. | \-template %>% map_chr(str_glue) %>% str_squish()
#> 3. +-stringr::str_squish(.)
#> 4. | +-stringi::stri_trim_both(str_replace_all(string, "\\s+", " "))
#> 5. | \-stringr::str_replace_all(string, "\\s+", " ")
#> 6. | \-stringr:::check_lengths(string, pattern, replacement)
#> 7. | \-vctrs::vec_size_common(...)
#> 8. +-purrr::map_chr(., str_glue)
#> 9. | \-purrr:::map_("character", .x, .f, ..., .progress = .progress)
#> 10. | +-purrr:::with_indexed_errors(...)
#> 11. | | \-base::withCallingHandlers(...)
#> 12. | +-purrr:::call_with_cleanup(...)
#> 13. | \-stringr (local) .f(.x[[i]], ...)
#> 14. | \-glue::glue(..., .sep = .sep, .envir = .envir)
#> 15. | \-glue::glue_data(...)
#> 16. +-glue (local) `<fn>`("file_name")
#> 17. | +-.transformer(expr, env) %||% .null
#> 18. | \-glue (local) .transformer(expr, env)
#> 19. | \-base::eval(parse(text = text, keep.source = FALSE), envir)
#> 20. | \-base::eval(parse(text = text, keep.source = FALSE), envir)
#> 21. \-base::.handleSimpleError(...)
#> 22. \-purrr (local) h(simpleError(msg, call))
#> 23. \-cli::cli_abort(...)
#> 24. \-rlang::abort(...)
# but this does?
file_name <- 'test'
fn_render_ce_template(
template = c('{file_name}_1', '{file_name}_2'),
file_name = 'test'
)
#> [1] "test_1" "test_2"
字符串
创建于2023-12-23使用reprex v2.0.2
1条答案
按热度按时间h5qlskok1#
定义匿名函数
简短的回答是,这是关于变量被求值的环境。你可以通过在
map_chr()
调用中定义一个匿名函数来解决这个问题:字符串
这将返回所需的输出:
型
说明
要了解为什么会发生这种情况,请查看
str_glue()
的函数definition:型
默认情况下,它在父帧中查找。当您使用
purrr::map_chr()
时,它最终调用purrr::map_()
,并且父帧不是正确的帧。你可以让你的函数手动指定帧,以了解发生了什么:
型
如果我们用
1
的堆栈帧号调用它,我们得到全局变量。型
这同样适用于堆栈帧号为2的情况。但是,如果我们用堆栈帧号为3的情况调用它:
幸运的是,我们不需要手动传递堆栈帧号,因为在函数中定义匿名函数意味着父帧是正确的,但希望这能让你了解为什么会发生这种行为。