dplyr中的函数评估总结

时间:2017-06-08 21:57:28

标签: r function aggregate tidyverse

我认为我遗漏了一些关于R如何评估事物的基本知识。请考虑以下事项:

contains

我尝试在自定义函数中包装x(没有更改),并添加了一个print语句来尝试对此进行调试,但它尽可能接近,即使是contains(list(1), x)的值为1(类仍为数字),TRUE在过滤器之外返回FALSE,但在其中返回unique

  1. 为什么?
  2. 可能相关,我真的不明白如何将列传递给像unique这样的函数,但是也可以传递给其他函数(比如我的自定义函数)。 (我知道你可以做,但不能做到这一点。)我的自定义函数表现得好像被多次调用一次,每次为x的值。但是,unique必须所有值,是吗?

    1. {{1}}和单参数函数如何在列上起作用?

1 个答案:

答案 0 :(得分:1)

看起来这个问题正在进行比较。在purrr::contains()的来源中,正在调用indentical()以将dt0$xlist[[i]]进行比较。 dt0$x的内容是整数,而1则不是。因此,要解决此问题,我们可以使用1L

> is.integer(1:10)
[1] TRUE
> is.integer(1)
[1] FALSE

> identical((1:10)[1], 1)
[1] FALSE
> identical((1:10)[1], 1L)
[1] TRUE

然而,对filter(dt0, purrr::contains(list(1L), x))的调用仍将返回零行,因为第二个参数未在purrr::contains()中迭代。因此,检查整个列x是否包含在list(1)中(当然是FALSE)。如果要以这种方式使用purrr::contains,则必须手动迭代第二个arg。

我认为语法不是那么优雅但是如果你想留在purrr你可以使用:

> filter(dt0, purrr::map_lgl(x,~purrr::contains(list(1L), .x)))
# A tibble: 1 × 2
      x     y
  <int> <int>
1     1    11
相关问题