【问题标题】:R package failing R CMD Check due to non standard expressions inside dplyr function arguments由于 dplyr 函数参数中的非标准表达式,R 包失败 R CMD 检查
【发布时间】:2020-09-14 03:57:50
【问题描述】:
    data.frame(a=1:20) %>%
    dplyr::mutate(x = ifelse(a <= 10 & a > 0, 10, a)) %>%
    dplyr::mutate(y = unlist(x) / sum(unlist(x)))

在上面的代码中,rcmdcheck::rcmdcheck() 抱怨ax 没有全局绑定。

以下是唯一的解决方案吗? 这样做是否值得:

    data.frame(a=1:20) %>%
    dplyr::mutate(x = {
      a <- get("a", envir=environment())
      ifelse(a <= 10 & a > 0, 10, a)}) %>%
    dplyr::mutate(y = {
      x <- get("x", envir=environment())
      unlist(x) / sum(unlist(x))})

【问题讨论】:

  • 在你的一个包.R文件中的某处添加这个(不是在一个函数中):utils::globalVariables(c("a","x"))
  • 我认为现在推荐的方法是使用.data$a而不是a,然后从.data导入代词dplyr
  • 这是好的做法吗? ax 不是全局变量吗?该函数将对全局命名空间做什么?
  • 从它的帮助页面:“对于'globalVariables',提供的名称是函数或其他对象,当'check'工具应用于这个包时,它们应该被认为是全局定义的。 " 所以我相信它们并没有与实际的包一起添加到全局命名空间中,只是为了检查而假设在那里。

标签: r dplyr tidyverse


【解决方案1】:

缓解这种情况的几种方法:

  1. 在包的.R 文件中的某处添加utils::globalVariables(c("a","x"))。不在函数内,需要在获取文件时(例如,在检查期间)进行此调用。

或者引用https://dplyr.tidyverse.org/articles/programming.html#eliminating-r-cmd-check-notes-1

  1. 使用.data$:

    data.frame(a=1:20) %>%
        dplyr::mutate(x = ifelse(.data$a <= 10 & .data$a > 0, 10, a)) %>%
        dplyr::mutate(y = unlist(x) / sum(unlist(x)))
    

    (您可能还需要.data$x。)

    编辑: @MrFlick commented 这需要从dplyrggplot2 导入.data 代词。

  2. 使用{{..}} 语义:

    x_ <- "x"
    data.frame(a=1:20) %>%
      dplyr::mutate({{x_}} := ifelse(a <= 10 & a > 0, 10, a)) %>%
      dplyr::mutate(y = unlist(x) / sum(unlist(x)))
    

    (您可能还需要unlist({{x_}}) ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2014-06-17
    相关资源
    最近更新 更多