【问题标题】:Function to save R list into separate Excel worksheets将 R 列表保存到单独的 Excel 工作表中的功能
【发布时间】:2012-08-29 18:31:32
【问题描述】:

来自this post 我得到了一个脚本,可以将列表导出为 Excel 文件中的单独工作表(代码如下)。现在我想将它包装在一个方便的函数中,通过提供输入列表名称和输出文件名来重现此行为。

样本数据:

var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4 )

当前脚本:

require("XLConnect")
wb <- loadWorkbook("var1.xlsx", create = TRUE)
createSheet(wb, names(var1))
writeWorksheet(wb, var1, names(var1),header=FALSE)
saveWorkbook(wb)

免责声明: 虽然问这么简单的问题我脸红了,但我相信 SO 的许多其他访问者会喜欢在这里找到这些信息 ;7)

EDIT :: 即用功能:

save.excel <-function(.list, default = 'var1', path = ''){
    require("XLConnect")
    .name <- as.list(match.call())[2]
    if(is.language(.name[[1]])) wb_name <- paste0(paste0(path, default, collapse = '/'), '.xlsx')
    if(is.symbol(.name[[1]])) wb_name <- paste0(paste0(path, as.character(.name), collapse = '/'), '.xlsx')
    wb <- loadWorkbook(wb_name, create = TRUE)
    createSheet(wb, names(.list))
    writeWorksheet(wb,.list, names(.list),header=FALSE)
    saveWorkbook(wb)
    }

与以下解决方案的唯一区别是我将 XLConnect 添加为从函数内部请求的库,以防您之前没有手动执行;7)

【问题讨论】:

  • 您的示例代码中没有 data.frames,只有一个命名列表
  • 你读过writeNamedRegion的帮助文件
  • @mnel,谢谢。我连续两天第二次犯了那个错字。 脸红
  • @mnel,是的,我做到了。目前我正在努力编写函数,而不是 XLConnect。
  • @dmvianna 问题的标题表明您正在寻找一个将内容保存到 Excel 的函数,但您真正的问题不是如何将一组命令包装到一个函数中吗?

标签: r function dataframe export-to-excel


【解决方案1】:

这是未经测试的,因为 XLConnect 不会安装在我的机器上。但类似下面的东西可能会起作用

简单的方法

一个有两个参数的函数

  • my_list - 您希望将其元素导出为单独工作表的列表
  • wb_name - 工作簿的名称

函数长这样

write_list <-function(my_list, wb_name = 'var1.xlsx') {    
  wb <- loadWorkbook(wb_name, create = TRUE)
  createSheet(wb, names(my_list))
  writeWorksheet(wb, my_list, names(my_list),header=FALSE)
  saveWorkbook(wb)
 }

将使用列表名称的精美选项

如果您想使用list 的名称来创建文件,那么您可以玩得开心 match.callis.symbolis.language。您为什么这样做的详细信息如下

write_list_name <-function(.list, default = 'var1', path = ''){
  .name <- as.list(match.call())[2]
   if(is.language(.name[[1]])){
     wb_name <- sprintf("%s/%s.xlsx", path, default)
   }
   if(is.symbol(.name[[1]])) {
    wb_name <- sprintf("%s/%s.xlsx", path, as.character(.name))
   }
  wb <- loadWorkbook(wb_name, create = TRUE)
  createSheet(wb, names(.list))
  writeWorksheet(wb,.list, names(.list),header=FALSE)
  saveWorkbook(wb)
  }

is.language/is.symbol/match.call处理这两种情况

write_list_name(var1)

#in which case .name[[1]] is the symbol var1

write_list_name(list(n=2:3))
# in which case .name[[1]] is list(n=2:3), and class language 
# a file called list(n=2:3).xlsx would be not ideal, hence the `default` argument.

【讨论】:

  • 从对象名称中推断出工作表的名称(如果可能的话),imo 会分散一点对 OP 问题的注意力。在一个更简单、更具说明性的 imo 示例中,用户可以指定 xlsx 文件的名称,即使用 wb_name 作为参数。
  • 此外,您可以通过一次调用 sprintf 来替换双 paste0 代码:例如sprintf("%s/%s.xlsx", path, default).
  • 是的,这可能是在给百合镀金或给布丁添油加醋(找到合适的成语)。我已经编辑了答案
  • @mnel +1 以获得全面的答案。
【解决方案2】:

除了@mnel的解决方案,这里还有一些关于函数的一般信息。

一般来说,函数看起来像这样:

function_name = function(input_a, input_b) {
    c = input_a * 2
    d = do_something(input_b)
    return(list(c, d))
}

其中input_ainput_b 是输入参数,list(c, d) 是返回值。调用函数时,此返回值将分配给= 左侧的对象:

out_a = function_name(a, b)

注意在function_nameab的函数体中替换input_ainput_ba 链接到 input_a 的事实是根据参数的顺序完成的。或者,可以使用命名参数:

out_a = function(input_a = a, input_b = b)

在我看来,这使函数调用更具可读性,尤其是对于选择得当的函数和参数名称。

【讨论】:

    【解决方案3】:

    如果有人需要最新的选项,请使用openxlsx,直接拨打write.xlsx如下:

    var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4 )
    write.xlsx(var1,"test.xlsx")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多