编辑:我发现问题源于yaml
代码。它来自于应用这个解决方案动态命名文件。我相信它创造了一个家长环境knitr
代码,因此list2env
造成意想不到的行为
需要明确的是,下面的代码在 R 中完美运行。
我在用list2env
with envir = .GlobalEnv
in my knitr
代码。这不起作用,因为它在外部创建对象knitr
环境(我收到错误像这样当我运行我的R
代码在R-markdown
,因为创建的对象只存在于全局环境中)。我正在尝试寻找替代方案list2env
或一种告诉方式list2env
列出当前的knitr
环境。
R 中的准备工作
# setwd to an empty folder
setwd("C:/../testing_environment")
library(writexl)
library(readxl)
# Example data
write_xlsx(mtcars, "mt_cars.xlsx")
write_xlsx(mtcars, "mt_car_s.xlsx")
在 R-markdown 中编织的代码 (link用于安装):
---
title: thetitle
author: myinititals
output:
word_document
date: "`r Sys.Date()`"
knit: (function(inputFile, encoding) {
out_dir <- 'test';
rmarkdown::render(inputFile,
encoding=encoding,
output_file=file.path(dirname(inputFile), out_dir, 'analysis.docx')) })
```{r}
library(writexl)
library(readxl)
setwd("C:/../testing_environment")
paths <- list.files(pattern="*.xlsx")
read_all_sheets <-
function(path) sapply(excel_sheets(path), read_excel, path = path, USE.NAMES = TRUE, simplify = FALSE)
xl_list <- sapply(paths, read_all_sheets, USE.NAMES = TRUE, simplify = FALSE)
# List to environment - ISSUE
for (i in seq_along(xl_list)) {
list2env(xl_list[[i]], envir = .GlobalEnv)
}
# THIS LINE CRASHES THE CODE
names(mt_car_s)
```
Error:
我已经检查了删除会发生什么names(mt_car_s)
并做:
list2env(xl_list, envir = .GlobalEnv)
## <environment: R_GlobalEnv>
ls()
## [1] "i" "paths" "read_all_sheets"
## [4] "xl_list"
但它根本没有列出其中的对象xl_list
.
有什么办法可以将这些文件放入环境中吗?例如写入创建的代码knitr
环境?如果不是,还有哪些其他可能的解决方案来防止这种行为?
编辑2,对于列表列表,您可以执行以下操作:
for (i in seq_along(xl_list)) {
n <- names(xl_list[[i]])
print(n)
for (j in seq_along(n)) {
assign(n[j], xl_list[[i]][[j]])
}
}