在purrr:map调用中对函数使用准引用参数

时间:2018-11-02 14:12:17

标签: r quasiquotes

我在弄清准引用时遇到了一些麻烦,特别是我有一个函数,该函数具有一个参数,该参数具有特殊性,该变量应进入模型,然后在purrr :: map调用中运行。

我一直在工作:https://dplyr.tidyverse.org/articles/programming.html

# libs
library(tidyverse)
library(broom)
# dummy data
df <- data.frame(
    "a"=rep(c("alpha","beta"),50),
    "b"=rnorm(100),
    "value1"=rnorm(100),
    "value2"=rnorm(100)
)

model <- function(var) {
    var <- enquo(var)
    df %>%
        group_by(a) %>%
        nest() %>%
        mutate(model=map(data, ~ lm(b ~ (!! var),data=.)))
}

model(value1)

> Error in mutate_impl(.data, dots) : Evaluation error: invalid model formula.

直接输入名称可以按预期工作:

df %>%
    group_by(a) %>%
    nest() %>%
    mutate(model=map(data, ~ lm(b ~ value1,data=.))) %>%
    unnest(model %>% map(glance))

我可以在函数中使用!! var

modelX <- function(var,df=df) {
    var <- enquo(var)
    df %>%
        select(!! var)
}

modelX(value1,df) 

我假设这与!! var引用嵌套小标题data中的值有关,我一直在研究rlang::qq_show(),但到目前为止还无法弄清楚”

1 个答案:

答案 0 :(得分:1)

import { last } from 'rxjs/operators'; this.getCurrentStatus().pipe(last()).subscribe(status => { console.log(status); if (status) { // treatment 1 } else { // treatment 2 } }); private status$: Subscription; getCurrentStatus(): Observable<Boolean> { if (!this.status) { this.status$ = this.store.pipe(select(fromUserSelector.getAuthStatus)).subscribe((status: Boolean) => { this.status = status; }); } return of(this.status); } 会尝试跟踪您传入的符号的环境,但是您实际上并不希望在传递给enquo()的公式中包含该符号。最好将其捕获为符号而不是担保。试试这个

lm

model <- function(var) { var <- ensym(var) df %>% group_by(a) %>% nest() %>% mutate(model=map(data, ~ lm(b ~ !!var, data=.))) } dplyr_0.7.6一起为我工作