我认为我遗漏了一些关于R如何评估事物的基本知识。请考虑以下事项:
contains
我尝试在自定义函数中包装x
(没有更改),并添加了一个print语句来尝试对此进行调试,但它尽可能接近,即使是contains(list(1), x)
的值为1(类仍为数字),TRUE
在过滤器之外返回FALSE
,但在其中返回unique
。
可能相关,我真的不明白如何将列传递给像unique
这样的函数,但是也可以传递给其他函数(比如我的自定义函数)。 (我知道你可以做,但不能做到这一点。)我的自定义函数表现得好像被多次调用一次,每次为x的值。但是,unique
必须所有值,是吗?
答案 0 :(得分:1)
看起来这个问题正在进行比较。在purrr::contains()
的来源中,正在调用indentical()
以将dt0$x
与list[[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