2017-12-14 13 views
1

私は2つのsqliteデータベースを作成しました。私はmagrittr/dplyr配管規則を使用して各データセットに1つのデータフレームを書きたいと思います。パイプを使用して複数のデータベース接続にテーブルを書き込む

conn1 <- DBI::dbConnect(drv = RSQLite::SQLite(), dbname = "db1") 
conn2 <- DBI::dbConnect(drv = RSQLite::SQLite(), dbname = "db2") 

iris %>% 
DBI::dbWriteTable(conn1, "iris", .) %>% # works 
DBI::dbWriteTable(conn2, "iris", .)  # does not work because lhs is not a table 

もう一つはdbWriteTableは、単一の接続

iris %>% 
DBI::dbWriteTable(c(conn1, conn2), "iris", .) 

を受け入れるので、私はパイプの変化を利用して溶液、iris

答えて

3

通常のパイプ演算子%>%は、前の関数の結果に沿って次の関数に渡されます。 DBI::dbWriteTable関数は、動作する場合はTRUEを返します。

magrittrをインポートする場合は、代わりに "tee"演算子%T>%を使用することができます。これは、元の関数が何を返しても元の入力に戻ってしまうだけです。例えば、

teeオペレータの詳細については、magrittr documentationを参照してください。

3

からの出力を保持し、おそらく変化を好む、試行を(失敗しました) MrFlicksのコメントの代わりに、walk、whを使用して接続のリストに対して繰り返しのためにpurrrまたはapplyの関数ファミリを使うことができます通常、副作用のために呼び出される関数を使用してリストを反復処理します。

library(DBI) 
library(purrr) 

conn1 <- dbConnect(drv = RSQLite::SQLite(), dbname = "db1") 
conn2 <- dbConnect(drv = RSQLite::SQLite(), dbname = "db2") 

connections <- list(conn1, conn2) 

walk(connections, ~dbWriteTable(.x, "iris", iris)) 
+0

これを再現できません... 'エラー:インデックス1は文字または数字のベクトルでなければなりません。' –

+0

これはセットアップで動作し、上記のコードを実行します。型不一致エラーが発生している既存のテーブルに書き込んでいる可能性があります。 –

関連する問題