R中readxl导入Excel后print(data)输出函数代码而非数据的问题
R调用readxl导入Excel后打印出函数代码而非表格数据的问题
问题复现
在R环境中使用readxl包导入指定Excel文件的Sheet2工作表,尝试打印导入生成的dataframe对象,使用代码如下:
library("readxl") data <- read_excel("grad programs.xlsx", sheet="Sheet2") print(data)
代码执行后控制台未输出Excel工作表的实际数据,反而打印出超长的函数定义代码,输出内容开头片段如下:
print(data) function (..., list = character(), package = NULL, lib.loc = NULL, verbose = getOption("verbose"), envir = .GlobalEnv, overwrite = TRUE) { fileExt <- function(x) { db <- grepl("\\.[^.]+\\.(gz|bz2|xz)$", x) ans <- sub(".*\\.", "", x) ans[db] <- sub(".*\\.([^.]+\\.)(gz|bz2|xz)$", "\\1\\2", x[db]) ans } my_read_table <- function(...) { lcc <- Sys.getlocale("LC_COLLATE") on.exit(Sys.setlocale("LC_COLLATE", lcc)) Sys.setlocale("LC_COLLATE", "C") read.table(...) } stopifnot(is.character(list)) names <- c(as.character(substitute(list(...))[-1L]), list) if (!is.null(package)) { if (!is.character(package)) stop("'package' must be a character vector or NULL") } paths <- find.package(package, lib.loc, verbose = verbose) if (is.null(lib.loc)) paths <- c(path.package(package, TRUE), if (!length(package)) getwd(), paths) paths <- unique(normalizePath(paths[file.exists(paths)])) paths <- paths[dir.exists(file.path(paths, "data"))] dataExts <- tools:::.make_file_exts("data") if (length(names) == 0L) { db <- matrix(character(), nrow = 0L, ncol = 4L) for (path in paths) { entries <- NULL packageName <- if (file_test("-f", file.path(path, "DESCRIPTION"))) basename(path) else "."
实际输出长度远大于上述展示片段,无法正常查看导入的Excel工作表数据。
问题原因
核心问题是代码中名为data的对象根本不是read_excel读取生成的表格,而是R内置的data函数——你看到的这段超长代码,就是R基础包自带的、用于加载内置数据集的data()函数源码,和目标Excel文件没有关系。
触发该问题的常见场景有三类:
read_excel()调用执行报错终止,给data赋值的操作没有完成,控制台输入print(data)时,R会自动匹配到全局环境默认存在的基础函数data,直接打印函数源码。- 代码执行顺序错误,批量运行代码时先执行到了
print(data)行,此时上方的赋值语句还未运行,同样会匹配到内置的data函数。 - 基础依赖或路径配置错误:readxl包未正确安装/加载、目标Excel文件不在当前R工作目录下、文件中不存在名为
Sheet2的工作表,都会导致read_excel()运行失败,赋值操作不生效。
排查解决步骤
按以下顺序操作即可定位并解决问题:
- 先运行
rm(data)清空当前环境中可能存在的同名冲突变量,避免对象匹配错误。 - 不要整段批量运行代码,逐行执行校验:
- 先运行
library("readxl"),确认包加载无报错,未加载成功先完成包安装。 - 再运行
read_excel赋值语句,重点关注控制台是否抛出错误:可通过getwd()查看当前R的工作目录,确认目标Excel文件存放在该路径下,同时核对工作表名拼写正确,也可以直接写文件的全路径避免路径匹配问题。
- 赋值语句执行完成后,先运行
class(data)校验对象类型:如果读取正常,返回值会包含tbl_df、tbl、data.frame三类标识;如果返回结果为"function",说明赋值操作未生效,回到上一步排查read_excel的报错原因即可。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

