gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:18:19 25 4
gpt4 key购买 nike

在阅读并重新阅读了许多“使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com