0

我在一个文件夹中有一堆 excel 文件,并想编写一个函数,如下所示:

# takes a file path and sheetname for an excel workbook, passes on additional params
getxl_sheet <- function(wb_path, sheetname, ...) {
  testbook <- XLConnect::loadWorkbook(wb_path)
  XLConnect::readWorksheet(testbook, sheet = sheetname, ...)
}  

但是,当我运行以下命令时,

set.seed(31415)
x <- rnorm(15); y <- rnorm(15)
randvals <- data.frame(x=x, y=y)
XLConnect::writeWorksheetToFile("~/temp_rands.xlsx", randvals, "Sheet1")
my_vals <- getxl_sheet("~/temp_rands.xlsx", "Sheet1", endRow=5)

my_vals 返回整个 15 x 2 数据帧,而不是仅在第五行停止(同样,如果我使用 'endCol=1' 例如,它会给出两列)。另一方面,在基础 R 中传递额外的参数并不是问题:

my_plot <- function(...) {
  plot(...)
}
#my_plot(x=x, y=y, pch=16, col="blue")

按预期工作。上面定义的读取 xlsx 文件的函数有什么问题?谢谢。

devtools::session_info() 会话信息------------------------------------------ --------------------------- 设置值
版本 R 版本 3.1.1 (2014-07-10) system x86_64, darwin13.1.0
ui RStudio (0.98.1062)
语言 (EN)
整理 en_US.UTF-8
tz America/New_York

包裹------------------------------------------------ ------------------------ 包 * 版本日期 来源
devtools 1.6.0.9000 2014-11-26 Github (hadley/devtools@bd9c252) rJava 0.9.6 2013-12-24 CRAN (R 3.1.0)
rstudioapi 0.1 2014-03-27 CRAN (R 3.1.0)
XLConnect * 0.2.9 2014-08-14 CRAN (R 3.1.1)
XLConnectJars * 0.2.9 2014- 08-14 克兰 (R 3.1.1)

4

1 回答 1

2

点机制需要有一个需要点的函数,与 不同的是plot.defaultreadWorksheet它不是为处理省略号而设计的:您需要在参数中构建一些解码:

getxl_sheetRCshort <- function(wb_path, sheetname, ...) {
  arglist <- list(...)
  testbook <- loadWorkbook(wb_path);
  readWorksheet(testbook, sheet = sheetname, 
                endRow=arglist[['endRow']], endCol=arglist[['endCol']])
}

> my_vals <- getxl_sheet("~/temp_rands.xlsx", "Sheet1", endRow=5)
> my_vals
           x           y
1  1.6470129 -1.27323204
2 -1.1119872 -1.77141948
3 -1.5485456  1.40846809
4 -0.7483785 -0.09450125

formals()您可以通过对函数的整个列表进行匹配来使其更加通用,readWorksheet并且 SO 中有工作示例可以说明这一点。幸运的是,解析器能够以某种方式忽略没有值传递给“endCol”的事实。

于 2014-11-27T18:38:57.143 回答