标签: rlang

dplyr 0.7当量已弃用mutate_

我无法找到dplyr 0.7替换将被弃用的mutate_函数的方法.

mutate_功能在我的使用情况是有用的:我存储在数据库(字符串格式)许多指令(即如果需要,可以过滤),并应用这些指令到一个或几个数据帧.

例如 :

dplyr::tibble(test = "test@test") %>% 
  dplyr::mutate_(.dots = list("test2" = "substr(test, 1, 5)",
                              "test3" = "substr(test, 5, 5)"))
Run Code Online (Sandbox Code Playgroud)

有没有办法用dplyr 0.7保存变量和指令作为字符?

r dplyr tidyeval rlang

6
推荐指数
2
解决办法
663
查看次数

在编程中使用dplyr合并

我想将dplyr的编程魔术(新于0.7.0版)用于coalesce两列。在下面,我列出了一些尝试。

df <- data_frame(x = c(1, 2, NA), y = c(2, NA, 3))

# What I want to do:
mutate(df, y = coalesce(x, y))

# Here's the expected output:
#> # A tibble: 3 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1     1     1
#> 2     2     2
#> 3    NA     3
Run Code Online (Sandbox Code Playgroud)

我以为fn1可以用,但是它varname在右侧被视为角色。

fn1 <- function(varname) {
  mutate(df, UQ(varname) := coalesce(x, !!varname))
}
fn1("y")
# Error in mutate_impl(.data, dots) : …
Run Code Online (Sandbox Code Playgroud)

r dplyr rlang

6
推荐指数
1
解决办法
3067
查看次数

检查包含生成函数的包的问题

我希望我知道如何使这个例子更小,但我不能很好地理解这个问题.

我有一个包重写R函数使它们尾递归:tailr.它对递归函数进行了一些分析,然后将其转换为循环函数.例如,它将转换此阶乘函数

factorial <- function(n, acc) {
    if (n <= 1) acc
    else factorial(n - 1, acc * n)
}
Run Code Online (Sandbox Code Playgroud)

进入这个版本

factorial <- function(n, acc) {
    .tailr_n <- n
    .tailr_acc <- acc
    callCC(function(escape) {
        repeat {
            n <- .tailr_n
            acc <- .tailr_acc
            if (n <= 1)
                escape(acc)
            else {
                .tailr_n <<- n - 1
                .tailr_acc <<- acc * n
            }
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

生成的函数并不漂亮,但确实有效.

我的问题是如果我编写一个使用转换的包,只包含R的这些行:

#' Computes the factorial.
#' @param n A number
#' @param acc Accumulator …
Run Code Online (Sandbox Code Playgroud)

r devtools rlang

6
推荐指数
0
解决办法
83
查看次数

purrr :: pmap与rlang的混淆行为; "引用"或不引用Q的论点

我有一个自定义函数,我正在从数据框中读取输入的变量rlang.无论输入的参数是引用还是不引用,此函数都可以正常工作.但是,奇怪的是,当使用此函数时purrr::pmap,它仅在引用参数时起作用.

所以我有两个问题:

  1. 为什么函数行为这样?

  2. 如何使用rlang这样一个函数,即使用于我也不必引用参数purrr::pmap

这是一个使用简单函数突出显示此问题的最小代表:

# loading the needed libraries
library(rlang)
library(dplyr)
library(purrr)


# defining the function
tryfn <- function(data, x, y) {
  data <-
    dplyr::select(
      .data = data,
      x = !!rlang::enquo(x),
      y = !!rlang::enquo(y)
    )

  # creating a dataframe of means
  result_df <- data.frame(mean.x = mean(data$x), mean.y = mean(data$y))

  # return the dataframe
  return(result_df)
}

# without quotes (works!)
tryfn(iris, Sepal.Length, Sepal.Width)
#>     mean.x   mean.y
#> 1 5.843333 3.057333 …
Run Code Online (Sandbox Code Playgroud)

r dplyr purrr tidyeval rlang

6
推荐指数
1
解决办法
127
查看次数

获取由`magrittr`调用的函数中得到的表达式

我有一个函数x_expression()打印传递给参数的表达式x.

pacman::p_load(magrittr, rlang)

x_expression <- function(x) {
  print(enquo(x))
}

y <- 1

x_expression(y)
#> <quosure>
#>   expr: ^y
#>   env:  global

y %>% x_expression()
#> <quosure>
#>   expr: ^.
#>   env:  0x7ff27c36a610
Run Code Online (Sandbox Code Playgroud)

所以你可以看到它知道y传递给它,但是当y管道输入时%>%,该函数返回打印..有没有办法y在它被管道输入的情况下恢复它,或者它是否永远消失了?简而言之,我想要的是一个类似于上面两种情况的x_expression()打印功能y.

这个问题确实类似于在R中通过管道传递的数据帧的获取名称,但它稍微更一般.这个人只想要数据框的名称,我想要表达式,无论它是什么.但是,相同的答案可能适用于两者.我不喜欢这个近似重复的问题的答案,答案的作者也不喜欢.

r magrittr tidyeval rlang

6
推荐指数
1
解决办法
119
查看次数

使用dplyr :: filter问题创建R函数

我已经查看了其他答案,但找不到下面代码的解决方案.基本上,我正在创建一个函数,inner_join即两个数据框并filter基于函数中输入的列.

问题是filter函数的一部分不起作用.但是,如果我将函数过滤掉并将其追加,它就可以工作mydiff("a") %>% filter(a.x != a.y)

任何建议都有帮助.

请注意,我是引号中的函数输入

library(dplyr)

# fake data
df1<- tibble(id = seq(4,19,2), 
             a = c("a","b","c","d","e","f","g","h"), 
             b = c(rep("foo",3), rep("bar",5)))
df2<- tibble(id = seq(10, 20, 1), 
             a = c("d","a", "e","f","k","m","g","i","h", "a", "b"),
             b = c(rep("bar", 7), rep("foo",4)))

# What I am trying to do
dplyr::inner_join(df1, df2, by = "id") %>% select(id, b.x, b.y) %>% filter(b.x!=b.y)

#> # A tibble: 1 x 3
#>      id b.x   b.y  
#>   <dbl> <chr> …
Run Code Online (Sandbox Code Playgroud)

r filter dplyr tidyeval rlang

6
推荐指数
2
解决办法
736
查看次数

安装开发版本的软件包时更新 rlang 时出现问题

我正在尝试安装 的开发版本tidyr。当我尝试devtools::install_github("tidyverse/tidyr")或 时remotes::install_github("tidyverse/tidyr"),出现以下错误:

\n\n
> devtools::install_github("tidyverse/tidyr")\nDownloading GitHub repo tidyverse/tidyr@master\nDownloading GitHub repo r-lib/vctrs@master\nThese packages have more recent versions available.\nWhich would you like to update?\n\n1:   All\n2:   CRAN packages only\n3:   None\n4:   rlang    (0.3.4 -> 18856f22a...) [GitHub]\n5:   ellipsis (0.1.0 -> 9908b24a2...) [GitHub]\n\nEnter one or more numbers separated by spaces, or an empty line to cancel\n1: 1\nrlang    (0.3.4 -> 18856f22a...) [GitHub]\nellipsis (0.1.0 -> 9908b24a2...) [GitHub]\nDownloading GitHub repo r-lib/rlang@master\n\xe2\x88\x9a  checking for file \'C:\\Users\\owner\\AppData\\Local\\Temp\\RtmpYDrYNh\\remotes96bc1c295445\\r-lib-rlang-18856f2/DESCRIPTION\' ...\n-  preparing \'rlang\': (2s)\n\xe2\x88\x9a  checking DESCRIPTION meta-information …
Run Code Online (Sandbox Code Playgroud)

r install.packages tidyr rlang

6
推荐指数
2
解决办法
1万
查看次数

有什么作用!!R 中的运算符均值

有人可以解释一下,我们需要什么!!!!!或者{{}}需要什么操作员吗rlang?我试图了解更多有关准引用的知识,但没有得到任何结果。

我已经在 Stack 上找到了几篇关于 curly-curly 运算符的帖子,并且了解我们{{在将数据帧的变量(或对象的其他子对象)传递到函数中时使用它。但在阅读了有关引用/取消引用的内容后,我对所有这些运算符及其用法完全感到困惑。

为什么我们需要它,为什么有些函数没有它就无法读取参数,最后,它们实际上是如何工作的?

如果您以最简单的方式给出答案,即使我也能理解(也许有例子?),我将不胜感激。

r quote tidyverse rlang quasiquotes

6
推荐指数
1
解决办法
2715
查看次数

Tidyverse、Rlang 和 tidyeval:Bang bang (!!) 在函数内部失败,但它似乎无需引用即可工作

我正在一个长数据库(full_database)上运行一个函数,该数据库有两个主要组,我需要在每个组的多个子集上执行各种线性模型。

然后,我将 R^2、调整后的 R^2 和 p.value 提取到数据框中,其中每一行对应于一次比较。由于有 30 种不同的情况,我有另一个小标题,其中列出了函数参数所在的所有可能性( possibility )。

原始函数的脚本是:

database_correlation <-  function(id, group) {

    require(dplyr)
    require(tidyr)
    require(rlang)

    id_name <- quo_name(id)
    id_var <- enquo(id)
    group_name <- quo_name(group)
    group_var <- enquo(group)

    corr_db <- full_database %>%
      filter(numid==!!id_name) %>%
      filter(major_group==!!group_name) %>%
      droplevels()

    correlation <- summary(lm(yvar~xvar, corr_db))

    id.x <- as.character(!!id_var) #Gives out an error: "invalid argument type"
    group.x <- as.character(!!group_var) #Gives out an error: "invalid argument type"
    r_squared <- correlation$r.squared
    r_squared_adj <- correlation$adj.r.squared
    p_value <- correlation$coefficients[2,4]

    data.frame(id.x, group.x, r_squared, r_squared_adj, …
Run Code Online (Sandbox Code Playgroud)

r tidyr tidyeval rlang

5
推荐指数
1
解决办法
906
查看次数

卷曲整洁的评估编程,具有多个输入和跨列的自定义函数

我的问题与this 问题类似,但我需要跨列应用更复杂的函数,并且我不知道如何将 Lionel 建议的解决方案应用到具有作用域动词 likefilter_at()filter()+across()等价物的自定义函数。{{{}}}看起来并没有引入“superstache”/运算符。

这是我想要做的一个非编程示例(不使用 NSE):

library(dplyr)
library(magrittr)

foo <- tibble(group = c(1,1,2,2,3,3),
              a = c(1,1,0,1,2,2),
              b = c(1,1,2,2,0,1))

foo %>%
  group_by(group) %>%
  filter_at(vars(a,b), any_vars(n_distinct(.) != 1)) %>%
  ungroup
#> # A tibble: 4 x 3
#>   group     a     b
#>   <dbl> <dbl> <dbl>
#> 1     2     0     2
#> 2     2     1     2
#> 3     3     2     0
#> 4     3     2     1
Run Code Online (Sandbox Code Playgroud)

我还没有找到filter_atfilter+相同的行across() …

r dplyr non-standard-evaluation tidyeval rlang

5
推荐指数
1
解决办法
393
查看次数