8

这篇文章中,我得到了一个脚本,该脚本将列表导出为 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)

编辑 :: 即用型功能:

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)

4

3 回答 3

8

这是未经测试的,因为 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.call,is.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.
于 2012-09-05T05:23:35.230 回答
2

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

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

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

其中input_a,和input_b是输入参数,并且list(c, d)是返回值。=此返回值分配给调用函数时位于左侧的对象:

out_a = function_name(a, b)

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

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

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

于 2012-09-05T05:28:32.417 回答
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")
于 2021-05-28T19:25:14.807 回答