R mutate()试图在使用美元符号运算符时使用全局变量的值进行提取

R mutate()试图在使用美元符号运算符时使用全局变量的值进行提取,r,dplyr,R,Dplyr,当全局环境中碰巧有一个变量与被提取的元素同名时,我使用mutate和$提取得到了有趣的结果。(我正在运行R3.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

当全局环境中碰巧有一个变量与被提取的元素同名时,我使用
mutate
$
提取得到了有趣的结果。(我正在运行R3.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
请注意,使用带字符串参数的双括号仍然可以正常工作:

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)

正如@clbieganek指出的,这是一个bug。它尚未修复(从dplyr版本4.3开始)

评论中建议的可能修复方法:

$'y'

这是跟踪此一般问题的问题:

看起来像个虫子。您可以使用
$'y'
,但这只是一种黑客行为。我会提交一份报告。双括号提取似乎是一个非常合理的解决方法。你也可以做这个看起来很有趣的事情:
mutate(df,val=`$`(大约(time,val,time),“y”)
实际上,看起来有人在六天前提交了这个bug:
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