前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R支持同名函数,小心李逵变李鬼

R支持同名函数,小心李逵变李鬼

作者头像
王诗翔呀
发布于 2021-11-09 07:21:01
发布于 2021-11-09 07:21:01
65002
代码可运行
举报
文章被收录于专栏:优雅R优雅R
运行总次数:2
代码可运行

程序出乎意料,怎么办?

今天在星球圈里收到提问:

img

我对ddply()这个函数是不熟悉的,只知道hadley一个过时的包plyr里有一系列这样的函数。所以我首先想到的是这位朋友用错了。不过我马上就排除了,这种问题是非常容易发现和处理的。

因此还是得动手实际检验一下这个问题在我的电脑上是否可以重复。

我们首先把数据导入进来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(scales)
library(tidyverse)
library(plyr)

ts <- openxlsx::read.xlsx("~/Downloads/示例数据.xlsx")
head(ts)
##      Name     variable      value
## 1 SLCO1B1 TCGA-44-2666 3.52916020
## 2    GCGR TCGA-44-2666 0.08499940
## 3   HTR3A TCGA-44-2666 0.05029628
## 4     CA9 TCGA-44-2666 0.19814361
## 5 TNFSF11 TCGA-44-2666 0.28202803
## 6     FGB TCGA-44-2666 4.56223499

按照两种不同的方法生成结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
out1 = ts %>%
 ddply(., .(variable), transform, rescale = rescale(value)) %>%
 arrange(variable, Name)

head(out1)
##    Name     variable       value     rescale
## 1 ADRB2 TCGA-05-4390  2.07637862 0.179759689
## 2 BIRC5 TCGA-05-4390  4.76410093 0.412445637
## 3   CA9 TCGA-05-4390  4.47563050 0.387471697
## 4   FGB TCGA-05-4390 11.55085787 1.000000000
## 5  GCGR TCGA-05-4390  0.06531648 0.005654687
## 6 HTR3A TCGA-05-4390  0.13418263 0.011616680
out2 = ts %>%
 group_by(variable) %>%
 mutate(rescale = rescale(value)) %>%
 ungroup() %>%
 arrange(variable, Name) %>%
 as.data.frame()

head(out2)
##    Name     variable       value     rescale
## 1 ADRB2 TCGA-05-4390  2.07637862 0.179759689
## 2 BIRC5 TCGA-05-4390  4.76410093 0.412445637
## 3   CA9 TCGA-05-4390  4.47563050 0.387471697
## 4   FGB TCGA-05-4390 11.55085787 1.000000000
## 5  GCGR TCGA-05-4390  0.06531648 0.005654687
## 6 HTR3A TCGA-05-4390  0.13418263 0.011616680

从结果的格式可以看的出来,它们从输入到输出经历的操作应该是相同的。

那么我们实际对比下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setdiff(out1, out2)
##       Name     variable      value     rescale
## 1    ADRB2 TCGA-21-5782 1.64848811 0.192834783
## 2    BIRC5 TCGA-21-5782 4.75155422 0.675892757
## 3      CA9 TCGA-21-5782 6.83355317 1.000000000
## 4      FGB TCGA-21-5782 0.84742072 0.068131673
## 5     GCGR TCGA-21-5782 0.51442280 0.016293492
## 6    HTR3A TCGA-21-5782 0.86791639 0.071322259
## 7      IL2 TCGA-21-5782 0.40975672 0.000000000
## 8    KCNA5 TCGA-21-5782 0.83802752 0.066669422
## 9    PADI4 TCGA-21-5782 0.65747836 0.038563121
## 10 SLCO1B1 TCGA-21-5782 0.91029877 0.077919974
## 11 TNFSF11 TCGA-21-5782 0.68943867 0.043538419
## 12   ADRB2 TCGA-38-4632 1.49522485 0.173357774
## 13   BIRC5 TCGA-38-4632 5.68731111 0.659392191
## 14     CA9 TCGA-38-4632 0.47006487 0.054499762
## 15     FGB TCGA-38-4632 8.62508107 1.000000000
## 16    GCGR TCGA-38-4632 0.10181144 0.011804114
## 17   HTR3A TCGA-38-4632 0.37084853 0.042996526
## 18     IL2 TCGA-38-4632 0.04300049 0.004985518
## 19   KCNA5 TCGA-38-4632 0.18014798 0.020886526
## 20   PADI4 TCGA-38-4632 0.11071744 0.012836683
## 21 TNFSF11 TCGA-38-4632 0.21541180 0.024975047
## 22   ADRB2 TCGA-44-2666 3.11114961 0.678389828
## 23   BIRC5 TCGA-44-2666 1.34130377 0.286131434
## 24     CA9 TCGA-44-2666 0.19814361 0.032768028
## 25     FGB TCGA-44-2666 4.56223499 1.000000000
## 26    GCGR TCGA-44-2666 0.08499940 0.007691400
## 27   HTR3A TCGA-44-2666 0.05029628 0.000000000
## 28     IL2 TCGA-44-2666 0.06204253 0.002603372
## 29   KCNA5 TCGA-44-2666 0.89569660 0.187369639
## 30   PADI4 TCGA-44-2666 0.26135921 0.046778767
## 31 SLCO1B1 TCGA-44-2666 3.52916020 0.771035279
## 32 TNFSF11 TCGA-44-2666 0.28202803 0.051359685
## 33   ADRB2 TCGA-49-AAQV 1.61516402 0.183927550
## 34   BIRC5 TCGA-49-AAQV 3.19367091 0.365190414
## 35     CA9 TCGA-49-AAQV 4.63585169 0.530798699
## 36     FGB TCGA-49-AAQV 8.72183748 1.000000000
## 37    GCGR TCGA-49-AAQV 0.01345201 0.000000000
## 38   HTR3A TCGA-49-AAQV 3.07484686 0.351545629
## 39     IL2 TCGA-49-AAQV 0.21759594 0.023442225
## 40   KCNA5 TCGA-49-AAQV 0.23745833 0.025723059
## 41   PADI4 TCGA-49-AAQV 0.07889044 0.007514416
## 42 SLCO1B1 TCGA-49-AAQV 1.10041358 0.124817806
## 43 TNFSF11 TCGA-49-AAQV 0.72236264 0.081405517

结果显示两个数据框确实不一样。那这是怎么回事?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
out1$rescale[which(out1$rescale != out2$rescale)]
##  [1] 0.192834783 0.675892757 1.000000000 0.068131673 0.016293492 0.071322259
##  [7] 0.000000000 0.066669422 0.038563121 0.077919974 0.043538419 0.173357774
## [13] 0.659392191 0.054499762 1.000000000 0.011804114 0.042996526 0.004985518
## [19] 0.020886526 0.012836683 0.024975047 0.678389828 0.286131434 0.032768028
## [25] 1.000000000 0.007691400 0.000000000 0.002603372 0.187369639 0.046778767
## [31] 0.771035279 0.051359685 0.183927550 0.365190414 0.530798699 1.000000000
## [37] 0.000000000 0.351545629 0.023442225 0.025723059 0.007514416 0.124817806
## [43] 0.081405517
out2$rescale[which(out1$rescale != out2$rescale)]
##  [1] 0.142715643 0.411359422 0.591605684 0.073364310 0.044535462 0.075138695
##  [7] 0.035474138 0.072551106 0.056920306 0.078807893 0.059687226 0.129447083
## [13] 0.492371317 0.040695234 0.746704805 0.008814189 0.032105713 0.003722710
## [19] 0.015596069 0.009585213 0.018648988 0.269343597 0.116121572 0.017154017
## [25] 0.394969365 0.007358709 0.004354333 0.005371249 0.077543730 0.022626822
## [31] 0.305532303 0.024416198 0.139830655 0.276487768 0.401342631 0.755081361
## [37] 0.001164590 0.266200735 0.018838077 0.020557636 0.006829834 0.095266827
## [43] 0.062537575

认真查看数据我发现这里的variable指代的是TCGA的样本,上面的操作是一个对不同样本进行相同处理的操作。最实际 的探索笨办法就是一个一个样本检查:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setdiff(out1[1:11, ], out2[1:11, ])
## [1] Name     variable value    rescale 
## <0> (0-长度的row.names)

第1个样本没有问题,继续:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setdiff(out1[12:22, ], out2[12:22, ])
##       Name     variable     value    rescale
## 1    ADRB2 TCGA-21-5782 1.6484881 0.19283478
## 2    BIRC5 TCGA-21-5782 4.7515542 0.67589276
## 3      CA9 TCGA-21-5782 6.8335532 1.00000000
## 4      FGB TCGA-21-5782 0.8474207 0.06813167
## 5     GCGR TCGA-21-5782 0.5144228 0.01629349
## 6    HTR3A TCGA-21-5782 0.8679164 0.07132226
## 7      IL2 TCGA-21-5782 0.4097567 0.00000000
## 8    KCNA5 TCGA-21-5782 0.8380275 0.06666942
## 9    PADI4 TCGA-21-5782 0.6574784 0.03856312
## 10 SLCO1B1 TCGA-21-5782 0.9102988 0.07791997
## 11 TNFSF11 TCGA-21-5782 0.6894387 0.04353842

问题出来了,那个是对的呢?手动算一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
out1[12:22, ]
##       Name     variable     value    rescale
## 12   ADRB2 TCGA-21-5782 1.6484881 0.19283478
## 13   BIRC5 TCGA-21-5782 4.7515542 0.67589276
## 14     CA9 TCGA-21-5782 6.8335532 1.00000000
## 15     FGB TCGA-21-5782 0.8474207 0.06813167
## 16    GCGR TCGA-21-5782 0.5144228 0.01629349
## 17   HTR3A TCGA-21-5782 0.8679164 0.07132226
## 18     IL2 TCGA-21-5782 0.4097567 0.00000000
## 19   KCNA5 TCGA-21-5782 0.8380275 0.06666942
## 20   PADI4 TCGA-21-5782 0.6574784 0.03856312
## 21 SLCO1B1 TCGA-21-5782 0.9102988 0.07791997
## 22 TNFSF11 TCGA-21-5782 0.6894387 0.04353842
out2[12:22, ] # there are some problem with the dplyr approach
##       Name     variable     value    rescale
## 12   ADRB2 TCGA-21-5782 1.6484881 0.14271564
## 13   BIRC5 TCGA-21-5782 4.7515542 0.41135942
## 14     CA9 TCGA-21-5782 6.8335532 0.59160568
## 15     FGB TCGA-21-5782 0.8474207 0.07336431
## 16    GCGR TCGA-21-5782 0.5144228 0.04453546
## 17   HTR3A TCGA-21-5782 0.8679164 0.07513870
## 18     IL2 TCGA-21-5782 0.4097567 0.03547414
## 19   KCNA5 TCGA-21-5782 0.8380275 0.07255111
## 20   PADI4 TCGA-21-5782 0.6574784 0.05692031
## 21 SLCO1B1 TCGA-21-5782 0.9102988 0.07880789
## 22 TNFSF11 TCGA-21-5782 0.6894387 0.05968723
rescale(out1[12:22, ]$value)
##  [1] 0.19283478 0.67589276 1.00000000 0.06813167 0.01629349 0.07132226
##  [7] 0.00000000 0.06666942 0.03856312 0.07791997 0.04353842

手动算的结果跟第1个是一致的,那么第2种方法肯定哪里出问题了。

难道是调用rescale()这个函数出了问题??由于这个函数要做的事情很简单,我们可以自己 写一个看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rescale2 <- function(x) {
 (x - min(x)) / (max(x) - min(x))
}

out3 = ts %>%
 group_by(variable) %>%
 mutate(rescale = rescale2(value)) %>%
 ungroup() %>%
 arrange(variable, Name) %>%
 as.data.frame()

setdiff(out1, out3)
##       Name     variable      value     rescale
## 1    ADRB2 TCGA-21-5782 1.64848811 0.192834783
## 2    BIRC5 TCGA-21-5782 4.75155422 0.675892757
## 3      CA9 TCGA-21-5782 6.83355317 1.000000000
## 4      FGB TCGA-21-5782 0.84742072 0.068131673
## 5     GCGR TCGA-21-5782 0.51442280 0.016293492
## 6    HTR3A TCGA-21-5782 0.86791639 0.071322259
## 7      IL2 TCGA-21-5782 0.40975672 0.000000000
## 8    KCNA5 TCGA-21-5782 0.83802752 0.066669422
## 9    PADI4 TCGA-21-5782 0.65747836 0.038563121
## 10 SLCO1B1 TCGA-21-5782 0.91029877 0.077919974
## 11 TNFSF11 TCGA-21-5782 0.68943867 0.043538419
## 12   ADRB2 TCGA-38-4632 1.49522485 0.173357774
## 13   BIRC5 TCGA-38-4632 5.68731111 0.659392191
## 14     CA9 TCGA-38-4632 0.47006487 0.054499762
## 15     FGB TCGA-38-4632 8.62508107 1.000000000
## 16    GCGR TCGA-38-4632 0.10181144 0.011804114
## 17   HTR3A TCGA-38-4632 0.37084853 0.042996526
## 18     IL2 TCGA-38-4632 0.04300049 0.004985518
## 19   KCNA5 TCGA-38-4632 0.18014798 0.020886526
## 20   PADI4 TCGA-38-4632 0.11071744 0.012836683
## 21 TNFSF11 TCGA-38-4632 0.21541180 0.024975047
## 22   ADRB2 TCGA-44-2666 3.11114961 0.678389828
## 23   BIRC5 TCGA-44-2666 1.34130377 0.286131434
## 24     CA9 TCGA-44-2666 0.19814361 0.032768028
## 25     FGB TCGA-44-2666 4.56223499 1.000000000
## 26    GCGR TCGA-44-2666 0.08499940 0.007691400
## 27   HTR3A TCGA-44-2666 0.05029628 0.000000000
## 28     IL2 TCGA-44-2666 0.06204253 0.002603372
## 29   KCNA5 TCGA-44-2666 0.89569660 0.187369639
## 30   PADI4 TCGA-44-2666 0.26135921 0.046778767
## 31 SLCO1B1 TCGA-44-2666 3.52916020 0.771035279
## 32 TNFSF11 TCGA-44-2666 0.28202803 0.051359685
## 33   ADRB2 TCGA-49-AAQV 1.61516402 0.183927550
## 34   BIRC5 TCGA-49-AAQV 3.19367091 0.365190414
## 35     CA9 TCGA-49-AAQV 4.63585169 0.530798699
## 36     FGB TCGA-49-AAQV 8.72183748 1.000000000
## 37    GCGR TCGA-49-AAQV 0.01345201 0.000000000
## 38   HTR3A TCGA-49-AAQV 3.07484686 0.351545629
## 39     IL2 TCGA-49-AAQV 0.21759594 0.023442225
## 40   KCNA5 TCGA-49-AAQV 0.23745833 0.025723059
## 41   PADI4 TCGA-49-AAQV 0.07889044 0.007514416
## 42 SLCO1B1 TCGA-49-AAQV 1.10041358 0.124817806
## 43 TNFSF11 TCGA-49-AAQV 0.72236264 0.081405517

问题依旧,数据肯定在rescale的时候出了问题。我debug()进去一看,发现全部的数据,而不是单独一个样本的数据作为输入!

在确定group_by()函数没有问题后,终于在mutate()上发现了端倪。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mutate
## function (.data, ...) 
## {
##     stopifnot(is.data.frame(.data) || is.list(.data) || is.environment(.data))
##     cols <- as.list(substitute(list(...))[-1])
##     cols <- cols[names(cols) != ""]
##     for (col in names(cols)) {
##         .data[[col]] <- eval(cols[[col]], .data, parent.frame())
##     }
##     .data
## }
## <bytecode: 0x7fbbcd1fa470>
## <environment: namespace:plyr>

环境显示它来自plyr。而我们实际想要使用的是dplyr包中的同名函数!

明确指定命名空间后发现问题也确实解决了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
out3 = ts %>%
 group_by(variable) %>%
 dplyr::mutate(rescale = rescale2(value)) %>%
 ungroup() %>%
 arrange(variable, Name) %>%
 as.data.frame()

setdiff(out1, out3)
## [1] Name     variable value    rescale 
## <0> (0-长度的row.names)

mutate()非彼mutate(),建议大家在发现类似问题时(一个常用函数做了一件意外的事情), 请检查使用的函数来自哪个包。

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

本文分享自 优雅R 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
聊聊HTML5中的Web Notification桌面通知
这种桌面提示是HTML5新增的 Web Push Notifications 技术。
Daotin
2019/07/28
2.4K0
H5的Notification特性 - Web的桌面通知功能
本文为joshua317原创文章,转载请注明:转载自joshua317博客 https://www.joshua317.com/article/49
joshua317
2021/08/31
2.3K0
H5的Notification特性 - Web的桌面通知功能
给 Pokers 加上 HTML5 Web Notification
正在研究 Websocket,先搞一搞 HTML5 特征 Web Notification API 来简单实现浏览器在线的消息推送
Tony He
2022/11/17
6600
H5 notification浏览器桌面通知
Notification是HTML5新增的API,用于向用户配置和显示桌面通知。上次在别的网站上看到别人的通知弹窗,好奇之余也想知道如何实现的。实际去查一下发现并不复杂,且可以说比较简单,故写篇博客分享给大家,希望能帮你们了解这个API。
OBKoro1
2020/10/27
1.9K0
H5 notification浏览器桌面通知
Html Notification通知的简单使用(转)
注意 最新的Chrome的Notification要想有效果需要https协议才行。
javascript.shop
2019/09/04
3.1K0
Html Notification通知的简单使用(转)
网站在线客服系统新消息提醒功能,支持浏览器桌面通知提醒,网页新消息声音,标题闪动效果功能实现
当我们的网站收到一条新消息的时候,需要能通知给正在访问网页的人员 浏览器打开的情况下,可以展示在电脑桌面右下角 //浏览器桌面通知 function notify(title, options, callback) { // 先检查浏览器是否支持 if (!window.Notification) { console.log("浏览器不支持notify"); return; } options.body=replaceHtml(options
唯一Chat
2023/02/17
1.3K0
网站在线客服系统新消息提醒功能,支持浏览器桌面通知提醒,网页新消息声音,标题闪动效果功能实现
[html5] (Notification) 桌面通知
[html5] (Notification) 桌面通知 前几天要做一个桌面通知的功能,翻查以前做的笔记,发现webkitNotifications这个已经不能用了,baidu了下,基本都是介绍webkitNotifications的,后来在SOF上找到答案,现在chrome支持的是Notification,估计是W3C标准化了。api也变了,mark之。 ---- Notification Properties title:"别动神仙说:" body:"这里是body" icon:"http://q4.ql
用户1631416
2018/04/11
1.3K0
[html5] (Notification) 桌面通知
在线客服系统源码开发实战总结:H5 Notifications浏览器桌面通知
如果自己在弹出授权申请的时候,点击了拒绝,那么可以去浏览器的通知设置里面重新打开下
唯一Chat
2022/11/21
1K0
在线客服系统源码开发实战总结:H5 Notifications浏览器桌面通知
H5 端唤醒 win10 消息通知
浏览器也可以调用Win10系统的消息提示,纯JS代码,复制到HTML网页中直接打开即可。 代码 // 判断浏览器是否支持唤醒 if (window.Notification) { let popNotice = () => { if (!Notification.permission === 'granted') return const notification = new Notification('Hello', { icon: requ
骤雨重山
2022/01/17
3670
Web Notification桌面推送消息
以上的问题其实都很好解决,MDN 上有很多配置可以去看一下,配置啥,图标呀,图片呀,标题呀,是否强制用户交互呀,等等的操作都在MDN 有介绍,接下来的我觉得才可以看看
我乃小神神
2020/04/30
1.7K0
HTML5中的Web Notification桌面通知
大家在做一些浏览器端的聊天功能的时候,或者在一些网站跟在线客服咨询的时候,会看到一些消息通知的提示,常见的有浏览器标签页的闪烁和屏幕右侧的消息通知。本篇博客就在这里简单的介绍一下如何实现这样的功能。 1、实现标签页闪烁效果 实现的效果: 当前窗体失焦的时候,标题开始闪动,当前窗体获取焦点的时候,则停止闪动。 注意:这里需要用到窗口的获取焦点和失去焦点的方法,由于IE和其他Chrome及FireFox的区别,这里需要用到的方法就不一样,具体是:   Chrome和FireFox浏览器是window的onf
用户1174387
2018/03/28
2.4K0
HTML5中的Web Notification桌面通知
Notification API,为你的网页添加桌面通知推送
其实,MDN 的说明已经可以让我们很清楚知道 Notification 的作用。Notification 能够为用户提供异步的桌面消息通知,即使你缩小浏览器或是活动在其他标签页,只要调用该 Api 的标签页没被关闭,它都能工作。在桌面端的浏览器中,除了 IE 不支持外,其他就均已支持。
WahFung
2020/08/24
2K0
Notification API,为你的网页添加桌面通知推送
【设备】桌面通知(Notifications)
概述 桌面通知(Notifications) API 可以方便的为web应用添加桌面通知功能。
Html5知典
2019/11/26
1.1K0
To add browser notifications to an online customer support live chat service system - gofly - self h
There are a number of benefits to adding browser notifications to an online customer service system, including:
唯一Chat
2023/01/05
3030
chrome右下角通知效果
HTML代码: <button id="button">有人想加你为好友</button> <p id="text"></p> JS代码: if (window.Notification) { var button = document.getElementById('button'), text = document.getElementById('text'); var popNotice = function() { if (Notification.pe
2021/11/08
8310
[Go] Go语言实战-基于websocket浏览器通知的实现
当我们使用了websocket技术实现了实时的推送访客来到消息,但是我们只能随时看着页面不离开才能知道有访客来到
唯一Chat
2020/07/28
5140
编程技巧│浏览器 Notification 桌面推送通知
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170855.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
2.9K0
编程技巧│浏览器 Notification 桌面推送通知
HTML5中的Web Notification桌面通知(右下角提示)
html5桌面通知(Web Notifications)对于需要实现在新消息入线时,有桌面通知效果的情况下非常有用,在此简单介绍一下这个html5的新属性。通过Web Notifications(桌面通知系统),网站可以在用户桌面弹出一条通知,无论用户是否浏览当前网页,甚至最小化了浏览器,通知均可到达用户桌面。 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title>
王小婷
2018/05/31
1.1K0
Web 推送技术
作者:villainthr 摘自 前端小吉米 伴随着今年 Google I/O 大会的召开,一个很火的概念--Progressive Web Apps 诞生了。这代表着我们 web 端有了和原生 AP
腾讯IVWEB团队
2017/03/13
4.9K0
前端技巧——js篇
复制操作 copy () { let url = this.code; let oInput = document.createElement('input'); oInput.value = url; document.body.appendChild(oInput); oInput.select(); // 选择对象 console.log(oINput.value); document.execCommand('Cooy'); // 执行浏览器复制命令 alert
流眸
2019/08/12
2.1K0
推荐阅读
相关推荐
聊聊HTML5中的Web Notification桌面通知
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档