当全局环境中的变量恰好与要提取的元素同名时,使用mutate
和$
提取我会得到有趣的结果。 (我正在运行R 3.1.3和dplyr 0.4.3.9。)这很好用:
library(dplyr)
df <- data.frame(time = 1:5, val = c(2.3, 3.9, NA, 8.1, 9.6))
mutate(df, val = approx(time, val, time)$y)
# time val
# 1 1 2.3
# 2 2 3.9
# 3 3 6.0
# 4 4 8.1
# 5 5 9.6
但是如果我定义一个全局变量y
,就会发生一些有趣的事情:
y <- 1L
mutate(df, val = approx(time, val, time)$y)
# Error: invalid subscript type 'integer'
请注意,使用带有字符串参数的双括号仍可按预期工作:
mutate(df, val = approx(time, val, time)[['y']])
# time val
# 1 1 2.3
# 2 2 3.9
# 3 3 6.0
# 4 4 8.1
# 5 5 9.6
有趣的是,如果y
是一个字符,我们会收到不同类型的错误:
y <- 'a'
mutate(df, val = approx(time, val, time)$y)
# Error: unsupported type for column 'val' (NILSXP, classes = NULL)
最后,为了完整性,这里有一个例子,证明这绝对是不列表提取的常用行为:
l <- list(y = 1:4)
y <- 'a'
l$y
# [1] 1 2 3 4
有谁知道为什么我们会在mutate
内获得这种奇怪的行为?有没有一种简单的方法可以解决这个问题,除了使用双括号进行提取或确保搜索路径上没有冲突的变量?
顺便说一句,看起来以下帖子中的OP可能有同样的问题,但没有完全意识到: dplyr mutate fails with named vector?
答案 0 :(得分:3)
正如@clbieganek所指出的,这是一个错误。它尚未修复(从dplyr版本4.3开始)
评论中建议的可能修复:
$'y'
这是跟踪此一般问题的问题: https://github.com/hadley/dplyr/issues/1400