我创建了两个sqlite数据库,我想使用magrittr / dplyr管道约定为每个数据库写一个数据帧。
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
输出的变体
答案 0 :(得分:3)
除了MrFlicks评论之外,您可以使用purrr
或apply
系列函数使用walk
对连接列表进行迭代,使用通常调用的函数迭代列表因为它们的副作用。
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))
答案 1 :(得分:3)
普通管道运算符%>%
将前一个函数的结果传递给下一个函数。如果DBI::dbWriteTable
函数有效,它将返回TRUE
。它不会重新传递传递给它的data.frame
如果您导入magrittr
,则可以使用&#34; tee&#34;运营商%T>%
。这基本上抛弃了前一个函数返回的内容,并且只是再次传递原始输入。例如
iris %T>%
DBI::dbWriteTable(conn1, "iris", .) %T>%
DBI::dbWriteTable(conn2, "iris", .)
有关T恤操作员的更多信息,请参阅magrittr documentation。