我试图理解为什么我的代码在使用reprex::reprex()运行时产生的结果与直接从脚本运行的结果不同,以及如何始终如一地生成reprex()调用的输出。这个问题出现在filter()电话会议上。
reprex::reprex()运行它时(从控制台输出中截图),函数将根据列与另一个向量的匹配筛选data.frame行(控制台输出中的截图)显示,在脚本中直接运行完全相同的代码会抛出一个'match' requires vector arguments error.!!sym()似乎正在创建某种时间序列对象的函数进行轻微修改。省略sym()并将==替换为%in%具有相同的==更新:
这个问题没有在别人的机器上复制,也没有在我自己的机器上复制。我将一个RStudio项目转换成一个.R文件,它仍然保持不变。然而,当我Cntrl+Shift+F10分离库、数据等时,这种差异消失了。这表明我正在处理某种命名空间问题。返回到RStudio项目后,问题将返回。但是,在函数中调用dplyr::filter()解决了这个问题--加强了它是一个命名空间问题。
虽然接受的答案提供了一些解决方案并正确标识了问题,但悬而未决的问题(对于另一篇文章)是,为什么在此情况下,在我立即加载包之前没有应用命名空间优先级。
示例1:!!sym()在使用reprex::reprex()运行代码时,按照预期为reprex::reprex()生成一个向量
# Packages
library(dplyr)
library(rlang)
# Example data
mydat <- data.frame(type = c("a","b","c","a","c"))
myvec <- c("a","c")
# Example function
foo <- function(df, type_var = "type", vec){
df %>%
filter(!!sym(type_var) %in% vec)
}
# Call function
foo(df = mydat, type_var = "type", vec = myvec)
#> type
#> 1 a
#> 2 c
#> 3 a
#> 4 c示例2:控制台输出在R脚本中运行时显示类型错误

示例3:略有修改的函数显示!!sym()正在创建一个时间序列对象?!
# Example function
foo <- function(df, type_var = "type", vec){
df %>%
filter(!!sym(type_var) == "a")
}
# Apply function
foo(df = mydat, type_var = "type", vec = myvec)
#>Time Series:
#>Start = 1
#>End = 5
#>Frequency = 1
#> [,1]
#> [1,] 0
#> [2,] 0
#> [3,] 0
#> [4,] 0
#> [5,] 0发布于 2022-08-13 08:12:53
它与使用的是哪个版本的filter有关,以及它是从stats还是dplyr导入的。我怀疑您在某个地方有一个~/.Rprofile,它正在加载一些库函数,这些函数有时会被加载,而其他函数则不会加载。
将示例3更改为
foo <- function(df, type_var = "type", vec){
df %>%
dplyr::filter(!!sym(type_var) == "a")
}
# Apply function
foo(df = mydat, type_var = "type", vec = myvec)产量:
type
1 a
2 a类似地将示例1更改为:
library(dplyr)
library(rlang)
# Example data
mydat <- data.frame(type = c("a","b","c","a","c"))
myvec <- c("a","c")
# Example function
foo <- function(df, type_var = "type", vec){
df %>%
dplyr::filter(!!sym(type_var) %in% vec)
}
# Call function
foo(df = mydat, type_var = "type", vec = myvec)给予:
type
1 a
2 c
3 a
4 c在控制台/Rscript中运行R时,小心名称空间冲突,很难跟踪bug。filter和lag是罪魁祸首(我几乎不得不撤回一篇期刊论文,因为lag是从Rscript上的错误名称空间导入的,并且以一种奇怪而沉默的方式失败)。
https://stackoverflow.com/questions/73342345
复制相似问题