使用省略号将参数传递给xlconnect函数

时间:2014-11-27 16:39:19

标签: r xlconnect

我在一个文件夹中有一堆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乘2的数据帧,而不是仅停留在第五行(同样,如果我使用&#39; endCol = 1&#39;例如,它同时给出两列)。另一方面,在基数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 CRAN(R 3.1.1)

1 个答案:

答案 0 :(得分:2)

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

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中有一些工作示例可以说明这一点。幸运的是,解析器能够以某种方式忽略没有值传递给&#39; endCol&#39;。