如何在knitr的knit_child中正确获取数据集名称作为标题?
解决knitr中用数据集名称作为章节标题的问题
问题出在deparse(substitute(x))在lapply环境下无法捕获到你想要的城市名称——因为lapply遍历列表时,x只是对列表元素的临时引用,并非带有原始名称的对象。另外你原代码里list(New York, Berlin)会报错,因为New York是未定义变量,需要把城市名作为字符串或给列表元素命名。
下面是两种可行的解决方案:
方案1:使用命名列表 + purrr::imap
先把cities改为命名列表(元素值可以是对应城市的数据,名称为城市名),再用imap遍历——它会同时传递元素值和对应的名称,直接用名称作为标题即可。
# 定义命名列表,替换your_newyork_data/your_berlin_data为实际城市数据 cities <- list("New York" = your_newyork_data, "Berlin" = your_berlin_data) res <- purrr::imap(cities, function(.x, .y) { knitr::knit_child( text = c( '\n', paste0('## ', .y), '\n', '```{r, out.height="100%", out.width="100%"}', 'some_plotting_function(.x)', '```' ), envir = environment(), quiet = TRUE ) }) cat(unlist(res), sep = "\n")
方案2:不依赖purrr,用索引遍历
如果不想引入purrr包,可以遍历列表的名称,手动取出每个名称对应的元素:
cities <- list("New York" = your_newyork_data, "Berlin" = your_berlin_data) res <- lapply(names(cities), function(city_name) { city_data <- cities[[city_name]] knitr::knit_child( text = c( '\n', paste0('## ', city_name), '\n', '```{r, out.height="100%", out.width="100%"}', 'some_plotting_function(city_data)', '```' ), envir = environment(), quiet = TRUE ) }) cat(unlist(res), sep = "\n")
特殊情况:仅需城市名字符串
如果你的cities只是单纯的城市名字符串列表,直接遍历字符串即可:
cities <- c("New York", "Berlin") res <- lapply(cities, function(city_name) { knitr::knit_child( text = c( '\n', paste0('## ', city_name), '\n', '```{r, out.height="100%", out.width="100%"}', 'some_plotting_function(city_name)', '```' ), envir = environment(), quiet = TRUE ) }) cat(unlist(res), sep = "\n")
内容的提问来源于stack exchange,提问作者tumbling_tower
相关产品推荐
相关产品推荐

