首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tidyeval框架中的逸出超作用域

tidyeval框架中的逸出超作用域
EN

Stack Overflow用户
提问于 2018-01-12 18:33:51
回答 1查看 78关注 0票数 5

如果我想使越界显式化,我可以像这样使用.data代词

代码语言:javascript
复制
library(dplyr)

cyl <- 3
transmute(as_tibble(mtcars), cyl_plus_one = .data$cyl + 1)
#> # A tibble: 32 x 1
#>    cyl_plus_one
#>           <dbl>
#>  1            7
#>  2            7
#>  3            5
#>  4            7
#>  5            9
#>  6            7
#>  7            9
#>  8            5
#>  9            5
#> 10            7
#> # ... with 22 more rows

然而,如果我想要避免显式的越界,那么相反的情况又如何呢?在下面的示例中,我想添加一个新列,其中包含值b (通过函数调用提供的值,而不是数据中的b )加上1,这显然不像现在声明的那样工作(因为越界)。

代码语言:javascript
复制
library(dplyr)
add_one <- function(data, b) {
  data %>%
    mutate(a = b + 1)
}
data <- data_frame(
  b  = 999
)
add_one(data, 3)
#> # A tibble: 1 x 2
#>       b     a
#>   <dbl> <dbl>
#> 1   999  1000

我还试图在mutate()调用之外创建新的值,但是我仍然需要依赖于new_val不在数据中。

代码语言:javascript
复制
library(dplyr)
add_one <- function(data, b) {
  new_val <- b + 1
  data %>%
    mutate(a = new_val)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-12 18:41:52

只需用!!取消引号,以查找该名称位于数据框架范围之上的变量:

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

add_one <- function(data, b) {
    data %>% mutate(a = !!b + 1)
}

data <- data_frame(b  = 999)

add_one(data, 3)
#> # A tibble: 1 x 2
#>       b     a
#>   <dbl> <dbl>
#> 1   999  4.00
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48232141

复制
相关文章

相似问题

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