首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用reprex()和从控制台运行代码会产生不同的结果

使用reprex()和从控制台运行代码会产生不同的结果
EN

Stack Overflow用户
提问于 2022-08-13 07:22:29
回答 1查看 60关注 0票数 1

我试图理解为什么我的代码在使用reprex::reprex()运行时产生的结果与直接从脚本运行的结果不同,以及如何始终如一地生成reprex()调用的输出。这个问题出现在filter()电话会议上。

  • Example 1显示,当我选择、复制、然后在RStudio.
  • Example 2中使用reprex::reprex()运行它时(从控制台输出中截图),函数将根据列与另一个向量的匹配筛选data.frame行(控制台输出中的截图)显示,在脚本中直接运行完全相同的代码会抛出一个'match' requires vector arguments error.
  • Example 3,并对!!sym()似乎正在创建某种时间序列对象的函数进行轻微修改。省略sym()并将==替换为%in%具有相同的==

更新:

这个问题没有在别人的机器上复制,也没有在我自己的机器上复制。我将一个RStudio项目转换成一个.R文件,它仍然保持不变。然而,当我Cntrl+Shift+F10分离库、数据等时,这种差异消失了。这表明我正在处理某种命名空间问题。返回到RStudio项目后,问题将返回。但是,在函数中调用dplyr::filter()解决了这个问题--加强了它是一个命名空间问题。

虽然接受的答案提供了一些解决方案并正确标识了问题,但悬而未决的问题(对于另一篇文章)是,为什么在此情况下,在我立即加载包之前没有应用命名空间优先级。

示例1:!!sym()在使用reprex::reprex()运行代码时,按照预期为reprex::reprex()生成一个向量

代码语言:javascript
复制
# 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()正在创建一个时间序列对象?!

代码语言:javascript
复制
# 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-13 08:12:53

它与使用的是哪个版本的filter有关,以及它是从stats还是dplyr导入的。我怀疑您在某个地方有一个~/.Rprofile,它正在加载一些库函数,这些函数有时会被加载,而其他函数则不会加载。

将示例3更改为

代码语言:javascript
复制
foo <- function(df, type_var = "type", vec){
  df %>% 
    dplyr::filter(!!sym(type_var) == "a")
}

# Apply function
foo(df = mydat, type_var = "type", vec = myvec)

产量:

代码语言:javascript
复制
  type
1    a
2    a

类似地将示例1更改为:

代码语言:javascript
复制
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)

给予:

代码语言:javascript
复制
  type
1    a
2    c
3    a
4    c

在控制台/Rscript中运行R时,小心名称空间冲突,很难跟踪bug。filterlag是罪魁祸首(我几乎不得不撤回一篇期刊论文,因为lag是从Rscript上的错误名称空间导入的,并且以一种奇怪而沉默的方式失败)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73342345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档