【问题标题】:Passing arguments to xlconnect functions with ellipses使用省略号将参数传递给 xlconnect 函数
【发布时间】:2015-01-26 07:53:45
【问题描述】:

我在一个文件夹中有一堆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) 系统 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)

【问题讨论】:

  • 查看帮助页面的功能代码或使用部分。 readWorksheet 没有处理... 的机制

标签: r xlconnect


【解决方案1】:

dots 机制需要有一个需要点的函数,并且与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

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

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 2016-07-11
    • 2018-06-21
    • 2017-03-02
    • 2013-05-22
    • 1970-01-01
    • 2019-09-10
    • 2013-04-25
    相关资源
    最近更新 更多