Edit: I figured out that the issue stems from the 101 code. It comes from applying this solution to 100. I believe it creates a parent environment within the 102 code, because of which 103 creates unexpected behaviour
需要明确的是,下面的代码在R中运行得非常完美.
我在knitr
代码中使用list2env
和envir = .GlobalEnv
.这不起作用,因为它会在knitr
环境之外创建对象(当我在R-markdown
中运行R
代码时,我得到一个错误like this,因为创建的对象只存在于全局环境中).我试图找到list2env
的替代方案,或者告诉list2env
在当前的knitr
环境中列出.
Preparation in 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")
Code to knit in R-markdown (link for installation):
---
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
环境的代码?如果没有,还有什么其他可能的解决方案来防止这种行为?
EDIT 2, for a list of list you can do:
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]])
}
}