前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >21. R 茶话会(二:包函数名冲突问题)

21. R 茶话会(二:包函数名冲突问题)

作者头像
北野茶缸子
发布2021-12-17 09:14:47
1K0
发布2021-12-17 09:14:47
举报
文章被收录于专栏:北野茶缸子的专栏

参见:https://mp.weixin.qq.com/s/oxElKitqQjwtD8HkpKk_JQ

虽然说世界上没有两片相同的叶子,但却有几万个张伟,无数个小明。

R 包也一样,有时候明明我需要用的是xx 包的xx 函数,却被R 误当作aa 包的xx 函数。虽然它们都叫做xx 函数,但功能却是大相径庭。

这时候有两种应对的思路。一个是从使用者层面,一个是从开发者层面。

开发者:R告诉你 你错了

我们如何避免这样的问题呢。其实作为R 包的开发者来说,最好还是显式调用:

代码语言:javascript
复制
> tidyr::tibble(mat)

但有的时候,这样做也比较麻烦。要是R 可以帮我们区分,环境中是否发生冲突就好了。即如果环境中有两个函数名相同,就告诉我们要显式调用。

conflicted 便可以解决它:

代码语言:javascript
复制
> library(stats)
> library(tidyverse)
> filter
Error: [conflicted] `filter` found in 2 packages.
Either pick the one you want with `::` 
* dplyr::filter
* stats::filter
Or declare a preference with `conflict_prefer()`
* conflict_prefer("filter", "dplyr")
* conflict_prefer("filter", "stats")
Run `rlang::last_error()` to see where the error occurred.

我们可以参照:

将conflicted 包加载在启动配置中。

使用者:你告诉R 他错了

参见:https://mp.weixin.qq.com/s/l90spoS_YQ-6AFcLiqEp0g

虽然我们自己在直接使用函数的时候,用conflicted 是个不错的习惯,并且尽量的使用显式调用。可是在你的环境中不冲突的函数,未必在别人的环境不冲突呀。

而且,有得人开发的R 包使用的函数,很有可能跟你使用的其他函数撞名,直接去修改别人包中函数的源代码,成本就太大了:

代码语言:javascript
复制
> showDatabaseCategory(CellChatDB)
Error: Problem with `summarise()` input `value`.
x could not find function "n"
ℹ Input `value` is `n()`.
ℹ The error occurred in group 1: annotation = "Cell-Cell Contact".
Run `rlang::last_error()` to see where the error occurred.

这时候我们可以先看看环境中哪些包有该撞名的函数:

代码语言:javascript
复制
?summarise 
Summarise a data frame.
(in package plyr in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)
Objects exported from other packages
(in package plotly in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)
Summarise each group to fewer rows
(in package dplyr in library /Library/Frameworks/R.framework/Versions/4.0/Resources/library)

这个时候加载的顺序也就是函数在环境中的优先级,可见dplyr 所在的位置优先级靠后,因此在使用函数时,R 首先认为是plyr 这个包中的函数。

这个时候直接重新加载一下dplyr 包,优先级就上来了。报错也就轻松解决了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开发者:R告诉你 你错了
  • 使用者:你告诉R 他错了
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档