首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rlang:在map()中使用.x和quosure?

rlang:在map()中使用.x和quosure?
EN

Stack Overflow用户
提问于 2019-05-07 15:39:45
回答 2查看 606关注 0票数 4

我试图将data.frame中的一组变量/值传递给map函数,但不知道如何处理.x引用需要评估的质量这一事实:mutate(df2 = map2(variable, value, ~filter(df1, .x==.y))) --天真的!!.x将无法工作。

在这里,我的data.frame有一个变量列,一个值列,将在一个过滤器调用中映射:

代码语言:javascript
复制
tibble(variable=c("wool", "tension"), 
       value= c("A", "L")) 
#> # A tibble: 2 x 2
#>   variable value
#>   <chr>    <chr>
#> 1 wool     A    
#> 2 tension  L

我怎样才能把这些传递给过滤器?我应该把变量声明为数量吗?我尝试了几种方法:

代码语言:javascript
复制
library(tidyverse)
data(warpbreaks)

tibble(variable=c("wool", "tension"), 
       value= c("A", "L")) %>% 
  mutate(data_filtered=map2(variable, value, ~filter(warpbreaks, .x==.y)))
#> # A tibble: 2 x 3
#>   variable value data_filtered       
#>   <chr>    <chr> <list>              
#> 1 wool     A     <data.frame [0 × 3]>
#> 2 tension  L     <data.frame [0 × 3]>

tibble(variable=c(quo(wool), quo(tension)), 
       value= c("A", "L")) %>% 
  mutate(data_filtered=map2(variable, value, ~filter(warpbreaks, eval_tidy(.x)==.y)))
#> Error in eval_tidy(.x): object 'wool' not found
EN

回答 2

Stack Overflow用户

发布于 2019-05-09 07:18:02

在您的示例中,您尝试以嵌套的方式使用dplyr谓词:mutate()中有一个mutate()。这对于正常使用很好,但是我们在使用整洁的eval特性时需要小心一点,因为这些特性在调用外部函数时应用得很早。由于这个原因,如果您尝试在内部动词中使用!!.data,通常会出现计时问题。

@zack的答案显示了如何分两步分解问题,以避免嵌套问题。在这种情况下,另一种可能是通过直接在mutate()上映射来省略df步骤(因为这个想法可以直接映射到@Spacedman )。在这里,我们将使用pmap(),它在列表或数据框架上并行映射:

代码语言:javascript
复制
# For pretty-printing
options(tibble.print_max = 5, tibble.print_min = 5)
warpbreaks <- as_tibble(warpbreaks)

pmap(df, ~ filter(warpbreaks, .data[[.x]] == .y))
#> [[1]]
#> # A tibble: 27 x 3
#>   breaks wool  tension
#>    <dbl> <fct> <fct>
#> 1     26 A     L
#> 2     30 A     L
#> 3     54 A     L
#> 4     25 A     L
#> 5     70 A     L
#> # … with 22 more rows
#>
#> [[2]]
#> # A tibble: 18 x 3
#>   breaks wool  tension
#>    <dbl> <fct> <fct>
#> 1     26 A     L
#> 2     30 A     L
#> 3     54 A     L
#> 4     25 A     L
#> 5     70 A     L
#> # … with 13 more rows
票数 1
EN

Stack Overflow用户

发布于 2019-05-09 10:01:44

您可以使用R的本机替换工具,在处理环境时,rlang更有价值,但是对于更复杂的符号替换(例如嵌套),基R更容易(至少对我来说)。

代码语言:javascript
复制
tibble(variable=c("wool", "tension"), 
       value= c("A", "L")) %>% 
  mutate(data_filtered=map2(variable, value, ~eval(bquote(
    filter(warpbreaks, .(sym(.x)) ==.y)))))

tibble(variable=c("wool", "tension"), 
       value= c("A", "L")) %>% 
  mutate(data_filtered=map2(variable, value, ~eval(substitute(
    filter(warpbreaks, X ==.y), list(X = sym(.x))))))

# output for either
# # A tibble: 2 x 3
#       variable value data_filtered        
#          <chr>    <chr> <list>               
#   1 wool     A     <data.frame [27 x 3]>
#   2 tension  L     <data.frame [18 x 3]>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56026143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档