【问题标题】:Could not find function "%<>%" with dplyr loaded加载 dplyr 时找不到函数“%<>%”
【发布时间】:2019-08-18 06:19:05
【问题描述】:

[免责声明:类似问题已被多次提出。我不相信这与我刚刚阅读的许多线程相同。]

我做到了:

library(dplyr)
colnames(LarvalSamples) %<>% 
  stringr::str_remove_all("_log") %>% 
  stringr::str_replace_all("Sea_Level", "Sea_Level_Height") %>% #sealevel, sealion, chinook, chl
  stringr::str_replace_all("SeaLion", "Sea_lion") %>% 
  stringr::str_replace_all("Chinook_Salmon", "Salmon") %>% 
  stringr::str_replace_all("Chlorophyll_a", "Chlorophyll_A")

工作正常,没有消息,按预期/期望输出。然后我复制/粘贴了前两行,除了终端管道:

colnames(LarvalSamples) %<>%
  stringr::str_remove_all("_log")

colnames 错误(LarvalSamples)%% stringr::str_remove_all("_log") : 找不到函数“%%”

我意识到这里还有其他关于找不到函数的帖子,但 dplyr 已加载并在上面两行代码上工作。碰巧colnames 中没有"_log" 模式,但我尝试了另一种确实存在的字符模式,但同样失败了,因此这是消除了一个潜在的错误来源。任何想法/猜测都值得赞赏,这感觉更像是一个错误,而不是一个问题,但如果需要的话,在将它提升到链上之前能更敏锐地观察它会很好。谢谢。

> sessionInfo()
R version 3.5.0 (2018-04-23)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17134)

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252   
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.8.0.1  beepr_1.3      gbm.auto_1.2.0

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.0       compiler_3.5.0   pillar_1.3.1     shapefiles_0.7   tools_3.5.0      tibble_2.0.1    
 [7] gtable_0.2.0     lattice_0.20-35  pkgconfig_2.0.2  rlang_0.3.1      Matrix_1.2-14    DBI_1.0.0       
[13] rstudioapi_0.9.0 rgdal_1.4-2      gbm_2.1.5        dismo_1.1-4      gridExtra_2.3    stringr_1.4.0   
[19] raster_2.8-19    mapplots_1.5.1   rgeos_0.4-2      grid_3.5.0       tidyselect_0.2.5 glue_1.3.0      
[25] R6_2.4.0         survival_2.41-3  foreign_0.8-70   sp_1.3-1         purrr_0.3.1      magrittr_1.5    
[31] codetools_0.2-15 splines_3.5.0    maptools_0.9-5   assertthat_0.2.0 stringi_1.3.1    crayon_1.3.4    
[37] audio_0.1-5.1  

更新:下面的可重现示例。这绝对似乎是一个错误。使用全新的系统:

Data <- data.frame(
    Name_Bad = sample(1:10),
    Name_Guud = sample(1:10)
  )

  colnames(Data) %<>%
    stringr::str_remove_all("_Bad") %>%
    stringr::str_replace_all("Guud", "Good")
  # Error: could not find function "%>%"

  install.packages("dplyr")
  library(dplyr)
  install.packages("stringr")
  library(stringr)

  colnames(Data) %<>%
    stringr::str_remove_all("_Bad") %>%
    stringr::str_replace_all("Guud", "Good")
# no error, worked

  colnames(Data) %<>%
    stringr::str_remove_all("_Bad")
  # Error: could not find function "%<>%"

【问题讨论】:

    标签: r dplyr pipe


    【解决方案1】:

    %&lt;&gt;% 不被 dplyr 导出(只有 %&gt;% 是)。您需要加载 magrittr。

    您的可重现示例遇到了a subtle magrittr bug,这会导致管道表达式的评估在 magrittr 的范围内搜索某些运算符,而不是在调用范围内。这样,x %&lt;&gt;% y %&gt;% z(其计算结果为 `%&gt;%`(x %&lt;&gt;% y, z))会找到并计算 magrittr 的 `%&lt;&gt;%` 运算符。

    【讨论】:

    • 谢谢;被接受为答案,但潜在的特殊性/不直观的行为仍然存在:为什么它在更长的管道中工作而不是单个命令?如果第一次通话失败,那么我会知道要深入研究......
    • @dez93_2000 对于您显示的代码,它从未在更长的管道中工作(您可以通过再次执行该命令轻松验证这一点)。相反,当您执行较长的代码时(由于某种原因)之前在活动会话中加载了 magrittr。
    • Konrad 我可以向你保证 100% 它确实适用于更长的代码,并且我在两个代码行执行之间没有任何改变(在加载/卸载包方面)。在您回答之前,我没有明确加载 magrittr。我今天必须尝试提交一篇论文,但是一旦我完成了这个主要的建模运行,我将尝试回到这个并制作一个简洁的可重复示例。再次为您的帮助喝彩。
    • 康拉德,您好,添加了可重现的示例,似乎是一个错误。
    • @dez93_2000 太棒了,感谢您的坚持。你是对的,这是一个可怕的错误,因为%&gt;% 将其参数范围用于评估。我将编辑我的答案以解释原因。尽管我怀疑它会被修复,但报告这个错误可能也是值得的。
    猜你喜欢
    • 2019-10-14
    • 2016-11-26
    • 2018-10-17
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多