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)

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)

4

3 に答える 3

8

XLConnect が私のマシンにインストールされないため、これはテストされていません。しかし、次のようなものがうまくいくかもしれません

シンプルなアプローチ

2 つの引数を持つ関数

  • 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// 2 つの状況に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と の関数本体でaと をb置き換えることinput_aに注意してくださいinput_baリンクされる事実input_aは、引数の順序に基づいて行われます。または、名前付き引数を使用できます。

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

これにより、私の意見では、特に適切に選択された関数名と引数名の場合、関数呼び出しが読みやすくなります。

于 2012-09-05T05:28:32.417 に答える