r - 在 R : NSE programing error in the tidyverse 中的函数中创建和使用新变量

标签 r dplyr tidyverse mutate nse

在阅读并重新阅读了许多“使用 dplyr 编程”指南后,我仍然找不到解决我的特殊情况的方法。

我了解使用group_by_ , mutate_并且这种“字符串友好”版本的 tidyverse 函数正在走向弃用,而 enquo是要走的路。

但是,我的情况有些不同,我正在努力寻找一种整洁的方法来解决它。

事实上,我的目标是在函数中创建和操作数据帧。基于其他变量创建(变异)新变量,使用它们等。

然而,无论我多么努力,我的代码在包检查时要么出错,要么返回一些警告,例如 no visible binding for global variable ... .

这是一个可重现的示例:

这是我想要做的:

df <- data.frame(X=c("A", "B", "C", "D", "E"),
                 Y=c(1, 2, 3, 1, 1))
new_df <- df %>%
  group_by(Y) %>%
  summarise(N=n()) %>%
  mutate(Y=factor(Y, levels=1:5)) %>%
  complete(Y, fill=list(N = 0)) %>%
  arrange(Y) %>%
  rename(newY=Y) %>%
  mutate(Y=as.integer(newY))

一些常见的 dplyr 操作,预期结果应该是:
# A tibble: 5 x 3
     newY     N     Y
<fctr> <dbl> <int>
1      1     3     1
2      2     1     2
3      3     1     3
4      4     0     4
5      5     0     5

我希望这段代码能够在函数内部安静地工作。以下是我处理非 NSE 问题的最佳尝试:
myfunction <- function(){
  df <- data.frame(X=c("A", "B", "C", "D", "E"),
                   Y=c(1, 2, 3, 1, 1))
  new_df <- df %>%
    group_by_("Y") %>%
    summarise(!!"N":=n()) %>%
    mutate(!!"Y":=factor(Y, levels=1:5)) %>%
    complete_("Y", fill=list(N = 0)) %>%
    arrange_("Y") %>%
    rename(!!"newY":="Y") %>%
    mutate(!!"Y":=as.integer(newY))
}

不幸的是,我仍然收到以下消息:
myfunction: no visible global function definition for ':='
myfunction: no visible binding for global variable 'Y'
myfunction: no visible binding for global variable 'newY'
Undefined global functions or variables:
  := Y n.Factors n_optimal newY

有办法解决吗?非常感谢!

编辑:我正在使用 R 3.4.1、dplyr_0.7.4、tidyr_0.7.2 和 tidyverse_1.1.1

回答

感谢我设法解决的评论,这是有效的解决方案:
myfunction <- function(){
  df <- data.frame(X=c("A", "B", "C", "D", "E"),
                   Y=c(1, 2, 3, 1, 1))
  new_df <- df %>%
    group_by_("Y") %>%
    summarise_("N"=~n()) %>%
    mutate_("Y"= ~factor(Y, levels=1:5)) %>%
    complete_("Y", fill=list(N = 0)) %>%
    arrange_("Y") %>%
    rename_("newY"=~Y) %>%
    mutate_("Y"=~as.integer(newY))
}

多谢 :)

最佳答案

答案不在“使用 dplyr 编程”指南中,因为您的问题更为普遍。尽管您的代码处理非标准评估,但您的案例不需要它。如果您删除处理非标准评估的代码,您将减少需要修复的问题数量。

尽管如此,一些重要的问题仍然存在——NAMESPACE 的问题。每当您在自己的包的函数中使用来自其他包的函数时,您都可以处理 NAMESPACE。 NAMESPACE 不是一个简单的话题,但如果你正在编写包,学习一点是值得的。我建议您阅读:从 r-pkgs.had.co.nz/namespace.html,找到“导入”部分并阅读其介绍以及副标题“R 函数”。这将帮助您理解我在下面发布的步骤、代码和评论。

请按照以下步骤解决您的问题:
- 将 dplyr、magrittr 和 tidyr 添加到说明中。
- 将函数称为 PACKAGE::FUNCTION() .
- 删除所有 !!:=因为在这种情况下你不需要它们。
- 从 magrittr 导入和导出管道。
- 从 rlang 导入 .data。
- 将全局变量传递给 utils::globalVariables()。
- 重建,重新加载,重新检查。

# I make your function shorter to focus on the important details.
myfunction <- function(){
  df <- data.frame(
    X = c("A", "B", "C", "D", "E"),
    Y = c(1, 2, 3, 1, 1)
  )
   df %>%
     dplyr::group_by(.data$Y) %>%
     dplyr::summarise(N = n())
}

# Fix check() notes

#' @importFrom magrittr %>%
#' @export
magrittr::`%>%`

#' @importFrom rlang .data
NULL

utils::globalVariables(c(".data", "n"))

关于r - 在 R : NSE programing error in the tidyverse 中的函数中创建和使用新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47225714/

相关文章:

r - 使用计算标签从 groupby 创建列

3 位字符序列的重复行值 - 整齐的数据

R::在r中将字符串从 "x,y"反转为 "y,x"

r - R 中的箭头键

c - 使三角形(或通常为正方形)矩阵对称

r - 如何在R中使用dplyr生成以当前行为条件的多行?

r - 根据两列中的值在 R 中创建新列

r - 省略列而不是将它们放在 purrr 中

r - R的LINEST函数模拟

r - 有没有其他方法可以实现 plotly R 的累积动画?