我注意到在检查一个包时,我获得了"全局变量没有可见绑定"的注释,当我使用类似函数时subset,使用列表元素的逐字名称作为参数.
例如,使用数据框:
foo < - data.frame(a = c(TRUE,FALSE,TRUE),b = 1:3)
我可以做愚蠢的事情,比如:
subset(foo,a)
transform(foo,a=b)
Run Code Online (Sandbox Code Playgroud)
哪个工作如预期.然而,R CMD中的R代码检查不理解这些引用元素并且抱怨没有任何可见的全局变量绑定.
虽然这个工作正常,但我真的不喜欢在我的包中加注,并且更喜欢它通过检查而没有任何错误,警告和注释.我也不想过多地修改我的代码.有没有办法编写这些代码,以便明确参数不引用全局变量?
在阅读并重新阅读了许多"使用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))
Run Code Online (Sandbox Code Playgroud)
一些常见的dplyr操作预期结果应该是:
# A tibble: 5 x 3
newY N Y
<fctr> <dbl> <int>
1 1 3 1
2 2 1 2
3 3 1 …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能抑制R中的这些混乱控制台的输出:
Note: no visible binding for global variable '.->ConfigString'
Note: no visible binding for '<<-' assignment to 'ConfigString'
Run Code Online (Sandbox Code Playgroud)
这是代码(它是一个简单的ReferenceClass,用于存储R项目的配置):
# Reference Class to store configuration
Config <- setRefClass("Config",
fields = list(
ConfigString = "character"
),
methods = list(
# Constructor
initialize = function() {
ConfigString <<- "Hello, World!"
}
)
)
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的
我曾经尝试过组合和排列预定义变量,将它们预先设置为null等,但是R仍然顽固地在源代码中打印数百个“无可见绑定”注释。
在R的内部方面,有人比我聪明吗?
更新1
我尝试将更Config <-改为Config <<-,从而摆脱了第二个多余的音符。但是,第一个无关的音符仍然存在。
更新2
我开始感到沮丧,甚至约翰·钱伯斯(John Chambers)的示例代码也产生了更多这些可怕的无关紧要的笔记。
更新3
这些说明出现在Revolution R v7.0中,但没有出现在RStudio中。好像Revolution R v7.0正在调用R CMD check,通常仅在准备软件包时使用,因此可以安全地忽略这些注释。
更新4
使用R CMD测试软件包的代码时,请使用非标准评估" no visible binding for global variable ..."为dplyr函数内使用的每个变量显示以下注释:例如,如果我使用
cars %>% mutate(speedplusone = speed +1)
Run Code Online (Sandbox Code Playgroud)
R CMD检查将给出注释:
no visible binding for global variable speed
Run Code Online (Sandbox Code Playgroud)
删除这些注释的问题已经被询问过,Hadley给出了答复,可以选择使用标准评估重写调用或通过调用伪造这些变量的存在globalVariables()。
根据Hadley的回答,我可以使用标准评估来删除那些R CMD Check注释,替换mutate为mutate_:
cars %>% mutate_(speedplusone = ~speed +1)
Run Code Online (Sandbox Code Playgroud)
我是否应该重写软件包中的所有dplyr函数调用,以完全避免非标准评估?
我有一个类似但不同的问题,当我的ggplot2语法合理时,如何处理R CMD检查"没有可见的全局变量绑定"注释?.
在那种情况下,通过使用aes_string而不是aes,一切都顺利进行.然而,这与plyr afaik无法实现.
例如,当我通过ddply引用数据框中的列名时会出现问题.
ddply(mydf, .(VarA, VarB, VarC, VarD), summarize, sum = sum(VarE))
#
# MyPackage: no visible binding for
# global variable ‘VarA’
Run Code Online (Sandbox Code Playgroud)
这段代码是完全有效和理智的,即使我理解使用NOTE,它们仍然会混淆输出窗口中的其他消息,使得包开发变得困难,并且实际上强制开发人员忽略NOTE.
摆脱这些笔记的正确方法是什么?或者替代方案是什么是以R CMD检查接受而不给出NOTE的方式编写代码的正确方法?
最好,迈克尔
上下文:尝试有效地解决我的无可见性绑定 CMD检查问题.
我尝试了两种口味captureOutput:
cmd_output <- R.utils::captureOutput(devtools::check(args="--no-tests"))
cmd_output <- utils::capture.output(devtools::check())
Run Code Online (Sandbox Code Playgroud)
和下沉
sink("cmd_output.txt")
devtools::check(args="--no-tests")
sink()
unlink("cmd_output.txt")
Run Code Online (Sandbox Code Playgroud)
无济于事.devtools::document()当我想要CMD注意和警告时,我最终得到了输出.
我正在尝试准备一个要提交给 CRAN 的包。在我的描述文件中,我在 Depends 和 Suggests 参数中包含了非 CRAN 包。为了告诉 R 在哪里可以找到非 CRAN 包,我包含了 Additional_repositories 参数;并且我在程序的顶部(即在“zzz.R”中)包含了一个 .onLoad 函数。只要所有 Depends 和 Suggests 包都存在,我就能够在 RStudio 中构建和检查 (--as-cran) 零警告、注释或错误。然后我使用 devtools::build() 在本地创建一个 .tar.gz 文件。
为了测试本地安装是否成功,我从我的计算机中删除了非 CRAN 包并尝试安装我创建的 .tar.gz 文件。然后我收到消息:
ERROR: dependency 'smwrQW' is not available for package 'baytrends'
Run Code Online (Sandbox Code Playgroud)
我已经阅读了
不幸的是,上述错误仍在继续。我对我使用的 url 充满信心,因为下面的 install.package 行在独立运行时有效
install.packages('smwrQW',repos=c("http://owi.usgs.gov/R"),dependencies = TRUE)
Run Code Online (Sandbox Code Playgroud)
描述和 zzz.R 文件的适用位如下:
描述:
Date: 2017-03-15
Depends:
R …Run Code Online (Sandbox Code Playgroud)