当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《mutate()在使用美元符号运算符时尝试使用全局变量的值进行提取》经验,为你挑选了0个好方法。

当全局环境中的变量恰好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失败了命名向量?

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有