【问题标题】:Using list names as names for sheets using XLConnect使用 XLConnect 将列表名称用作工作表的名称
【发布时间】:2013-02-28 15:57:28
【问题描述】:

正如标题所暗示的,我想做上面的事情。示例如下:

library(stringr)
library(XLConnect)

df <- data.frame(do.call("rbind", lapply(1:10, function(i) rnorm(10))))
df.list <- rep(list(df), 10)
names(df.list) <- paste("DataFrame", str_pad(1:length(df.list), 2, pad = "0"), sep = "")

df.list.workbook <- loadWorkbook("df.list.workbook.xlsx", create = TRUE)
lapply(1:length(df.list), function(i) createSheet(df.list.workbook, name = names(df.list[i])))
lapply(df.list[1:length(df.list)], function(i) writeWorksheet(df.list.workbook, i, sheet = names(i)))

最后一行是它抛出错误的地方:

Error: IllegalArgumentException (Java): Sheet index (-1) is out of range (0..9)

为了解决这个问题,我尝试了:

lapply(df.list[1:length(df.list)], function(i) print(names(i)))

并意识到列的名称被传递给工作表变量。任何想法如何克服这个问题?

【问题讨论】:

  • @James,给我Error in print(names(df.list)[i]) : error in evaluating the argument 'x' in selecting a method for function 'print': Error in names(df.list)[i] : invalid subscript type 'list'
  • 啊,我明白了。还需要更改为:lapply(seq_along(df.list), function(i) writeWorksheet(df.list.workbook, df.list[[i]], sheet = names(df.list)[i])。需要覆盖索引而不是列表。
  • 太棒了!您能否将其作为答案提交,以便我将其标记为已回答?

标签: r xlconnect


【解决方案1】:

您需要lapply 覆盖索引而不是列表:

lapply(seq_along(df.list), function(i) writeWorksheet(df.list.workbook, df.list[[i]], sheet = names(df.list)[i]))

【讨论】:

    【解决方案2】:

    XLConnect 在很多地方都被矢量化了。在你的情况下,这适用于createSheetwriteWorksheet,所以你可以写:

    df.list.workbook <- loadWorkbook("df.list.workbook.xlsx", create = TRUE)
    createSheet(df.list.workbook, name = names(df.list))
    writeWorksheet(df.list.workbook, data = df.list, sheet = names(df.list))
    saveWorkbook(df.list.workbook)
    

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多