将purr::walk2()应用于管道末端的data.frame中的data.frame

将purr::walk2()应用于管道末端的data.frame中的data.frame,r,purrr,R,Purrr,我有一个R数据框,其中有一列数据框,每个数据框都要打印到文件中: df0 <- tibble(x = 1:3, y = rnorm(3)) df1 <- tibble(x = 1:3, y = rnorm(3)) df2 <- tibble(x = 1:3, y = rnorm(3)) animalFrames <- tibble(animals = c('sheep', 'cow', 'horse'), frames =

我有一个R数据框,其中有一列数据框,每个数据框都要打印到文件中:

df0 <- tibble(x = 1:3, y = rnorm(3))
df1 <- tibble(x = 1:3, y = rnorm(3))
df2 <- tibble(x = 1:3, y = rnorm(3))

animalFrames <- tibble(animals = c('sheep', 'cow', 'horse'),
                       frames = list(df0, df1, df2))
或使用
purr
walk2
功能:

walk2(animalFrames$animals, animalFrames$frames,  ~write.csv(.y, file
= paste0('test_', .x, '.csv')))
有没有什么方法可以将这个walk函数放在
magrittr
管道的末尾

我的想法是:

animalFrames %>% do({walk2(.$animals, .$frames, ~write.csv(.y, file = paste0('test_', .x, '.csv')))})
但这给了我一个错误:

大概是因为
write.csv()
正在返回数据帧,而
do()
不处理这些或其他内容

我并没有真正的编码要求,我必须把walk放在管道的末尾(事实上,我总是可以围绕管道工作),但似乎我缺少了一些基本的东西,这让我感到困扰。
有什么建议吗?

我想你根本不需要
去做
。以下两项对我都有用。第一个简单地与您的相同减去
do
,我认为,第二个使用
magrittr
方便的
%%
操作符将列名公开给
walk2
并避免
$
。请注意,如果这是在管道的末端,那么使用
walk2
还是
map2
都没有多大关系,因为您不关心此步骤后返回的内容

注意:出于习惯,我还将
paste0
write.csv
替换为
tidyverse
等同物,但它们很容易放回原处

库(tidyverse)
df0以下对象已从“package:purrr”屏蔽:
#> 
#>设置名称
#>以下对象已从“package:tidyr”屏蔽:
#> 
#>提取
动物模型%$%
步行2(
.x=动物,
.y=帧,
.f=~write_csv(.y,str_c(“test_”),.x,.csv)
)
由(v0.2.0)于2018年3月13日创建

animalFrames %>% do({walk2(.$animals, .$frames, ~write.csv(.y, file = paste0('test_', .x, '.csv')))})
Error: Result must be a data frame, not character
Traceback:

1. animalFrames %>% do({
 .     walk2(.$animals, .$frames, ~write.csv(.y, file = paste0("test_", 
 .         .x, ".csv")))
 . })
2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
3. eval(quote(`_fseq`(`_lhs`)), env, env)
4. eval(quote(`_fseq`(`_lhs`)), env, env)
5. `_fseq`(`_lhs`)
6. freduce(value, `_function_list`)
7. withVisible(function_list[[k]](value))
8. function_list[[k]](value)
9. do(., {
 .     walk2(.$animals, .$frames, ~write.csv(.y, file = paste0("test_", 
 .         .x, ".csv")))
 . })
10. do.data.frame(., {
  .     walk2(.$animals, .$frames, ~write.csv(.y, file = paste0("test_", 
  .         .x, ".csv")))
  . })
11. bad("Result must be a data frame, not {fmt_classes(out)}")
12. glubort(NULL, ..., .envir = parent.frame())
13. .abort(text)