从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)
答案 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.call
,is.symbol
和is.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_a
和input_b
是输入参数,list(c, d)
是返回值。调用函数时,此返回值将分配给=
左侧的对象:
out_a = function_name(a, b)
请注意,在function_name
的函数正文中,a
和b
会替换input_a
和input_b
。 a
与input_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")