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代码中使用list2envenvir = .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:

enter image description here

我通过移除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]])
  }
}

推荐答案

渲染R标记文档的环境可以通过envir选项更改为rmarkdown::render().通常,无法保证渲染环境是全局环境或其子环境,因此不应try 将其指定给.GlobalEnv.

相反,通过在list2env()调用中将.GlobalEnv替换为environment()来分配给当前环境.

R相关问答推荐

如果行和列名以相同的开头,将矩阵值设置为0

以R为基数排列奇数个图

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

从嵌套列表中智能提取线性模型系数

为什么当我try 在收件箱中使用合并功能时会出现回收错误?

如何计算前一行的值,直到达到标准?

如何使下一个按钮只出现在Rshiny 的一段时间后?""

制作等距离的线串副本

如何通过ggplot2添加短轴和删除长轴?

根据类别合并(汇总)某些行

如何指定我的函数应该查找哪个引用表?

根据列表中项目的名称合并数据框和列表

R -使用矩阵reshape 列表

在散点图中使用geom_point放置线图例

有没有办法将不等长的列表转换为R中的数据帧

是否可以将线性模型的p值添加到tbl_summary中

如何在条形图中的x和填充变量中包含多个响应变量?

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

R没有按顺序显示我的有序系数?

R:水平旋转图