将R列表保存到单独的Excel工作表中的功能

时间:2012-09-05 04:49:29

标签: r function dataframe export-to-excel

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)

3 个答案:

答案 0 :(得分:6)

这是未经测试的,因为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.

答案 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_name的函数正文中,ab会替换input_ainput_bainput_a链接的事实是基于参数的顺序完成的。或者,可以使用命名参数:

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

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

答案 2 :(得分:0)

如果有人需要最新选项,请使用 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")