标签: lazyeval

使用dplyr将变量作为函数的默认参数

目标

我的目标是定义一些在dplyr动词中使用的函数,它们使用预定义的变量.这是因为我有一些这些函数带有一堆参数,其中许多参数都是相同的变量名.

我的理解:这很难(也许是不可能的)因为dplyr稍后会懒惰地评估用户指定的变量,但是任何默认参数都不在函数调用中,因此不可见dplyr.

玩具示例

考虑以下示例,我用它dplyr来计算变量是否已更改(在这种情况下相当无意义):

library(dplyr)
mtcars  %>%
  mutate(cyl_change = cyl != lag(cyl))
Run Code Online (Sandbox Code Playgroud)

现在,lag还支持备用排序,如下所示:

mtcars  %>%
  mutate(cyl_change = cyl != lag(cyl, order_by = gear))
Run Code Online (Sandbox Code Playgroud)

但是,如果我想创建自己的版本lag,总是按顺序排序gear呢?

尝试失败

天真的方法是这样的:

lag2 <- function(x, n = 1L, order_by = gear) lag(x, n = n, order_by = order_by)

mtcars %>%
  mutate(cyl_change = cyl != lag2(cyl))
Run Code Online (Sandbox Code Playgroud)

但这显然会引发错误:

没有找到名为'gear'的对象

更现实的选择是这些,但它们也不起作用:

lag2 <- function(x, n = 1L) lag(x, n = n, order_by = ~gear) …
Run Code Online (Sandbox Code Playgroud)

r scoping dplyr lazyeval

17
推荐指数
2
解决办法
1249
查看次数

如何将一个不带引号的列名列表送入`lapply`(以便我可以使用`dplyr`函数)

我正在尝试编写一个函数tidyverse/dplyr,我想最终使用lapply(或map).(我一直在努力回答这个问题,但发现了一个有趣的结果/死胡同.请不要将其标记为重复 - 这个问题是你在那里看到的答案的延伸/背离.)

是否有
1)获取引用变量列表以在dplyr函数内工作
(并且不使用已弃用的SE_函数)的方法, 或者是
2)某种方式通过一个lapply或多个方式提供一个未加引号的字符串列表map

我使用Programming in Dplyr小插图来构建我认为最符合当前使用NSE标准的功能.

样本数据:

sample_data <- 
    read.table(text = "REVENUEID AMOUNT  YEAR REPORT_CODE PAYMENT_METHOD INBOUND_CHANNEL  AMOUNT_CAT
               1 rev-24985629     30  FY18           S          Check            Mail     25,50
               2 rev-22812413      1  FY16           Q          Other      Canvassing   0.01,10
               3 rev-23508794    100  FY17           Q    Credit_card             Web   100,250
               4 rev-23506121    300  FY17           S    Credit_card            Mail   250,500
               5 rev-23550444    100  FY17           S    Credit_card             Web   100,250
               6 rev-21508672 …
Run Code Online (Sandbox Code Playgroud)

r dplyr lazyeval tidyverse rlang

10
推荐指数
1
解决办法
517
查看次数

错误:程序包或命名空间加载失败

当我在R中加载一些库时,我收到以下错误:

library(预测)错误:对象'f_eval'不是由'namespace:lazyeval'导出的另外:警告消息:包'forecast'是在R版本3.3.2下构建的错误:包'或命名空间加载失败'预测'

库(tsoutliers)错误:对象'f_eval'不是由'namespace:lazyeval'导出的另外:警告消息:包'tsoutliers'是在R版本3.3.2下构建的错误:'tsoutliers'的包或名称空间加载失败

我已经尝试重新安装软件包,但它没有帮助.此外,我之前能够使用预测包,但是在安装tsoutliers包后我开始面临这个错误.

我该如何解决这个问题?

r install.packages lazyeval

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

R lazyeval:将参数传递给 dplyr::filter

我认为这个问题有多种其他变化(例如:herehere ,也许here) - 甚至可能是某个地方的答案。

如何为过滤器函数提供参数。

library(dplyr)
library(lazyeval)
set.seed(10)
data <- data.frame(a=sample(1:10, 100, T))
Run Code Online (Sandbox Code Playgroud)

如果我需要计算数字 1 到 10 的出现次数并显示计数,比如 1、2 和 3,我会这样做:

data %>% 
  group_by(a) %>% 
  summarise(n = n()) %>% 
  filter(a < 4)
Run Code Online (Sandbox Code Playgroud)

给出:

# A tibble: 3 × 2
      a     n
  <int> <int>
1     1    11
2     2     8
3     3    16
Run Code Online (Sandbox Code Playgroud)

现在,我怎样才能把它放到一个函数中?这grp是分组变量。

   fun <- function(d, grp, no){
      d %>% 
        group_by_(grp) %>% 
        summarise_(n = interp(~ n() )) %>%
        filter_( grp < no)
        # …
Run Code Online (Sandbox Code Playgroud)

parameters r filter dplyr lazyeval

3
推荐指数
1
解决办法
1640
查看次数

标签 统计

lazyeval ×4

r ×4

dplyr ×3

filter ×1

install.packages ×1

parameters ×1

rlang ×1

scoping ×1

tidyverse ×1