我想在我自己编写%>%的magrittr包中使用包中引入的管道运算符来链接dplyr数据转换.magrittr列Import在DESCRIPTION文件中.加载我自己的包并测试使用管道操作符的函数后,我收到以下错误消息:
functionname中的错误(参数,:找不到函数"%>%"
更改%>%为magrittr::%>%函数源代码也无济于事,因为无法再构建包.
我是CRAN包的维护者,并在加载时收到以下消息:
* checking whether package ‘qdap’ can be installed ... [10s/10s] WARNING
Found the following significant warnings:
Warning: replacing previous import ‘annotate’ when loading ‘NLP’
Warning: replacing previous import ‘rescale’ when loading ‘scales’
Run Code Online (Sandbox Code Playgroud)
因为我使用plotrix和scale包以及NLP和ggplot包.他们具备的功能rescale和annotate共同点.这会导致最新的CRAN检查发出重大警告.所以我决定"修理"它.
我的描述是这样的:
Package: qdap
Type: Package
Title: Bridging the gap between qualitative data and quantitative analysis
Version: 1.0.0
Date: 2013-06-26
Author: Tyler Rinker
Maintainer: Tyler Rinker <tyler.rinker@gmail.com>
Depends:
R (>= 3.0.0),
ggplot2 (>= 0.9.3.1),
gdata,
grid,
Imports:
NLP,
openNLP,
plotrix,
scales,
LazyData: TRUE …Run Code Online (Sandbox Code Playgroud) 我已经阅读了两篇最近的帖子,讨论了Depends和Imports
但我有四个挥之不去的相关问题:
假设我希望最终用户在我的包中加载时也可以使用两个包.在这种情况下,是否有充分的理由不使用Depends?(这里的要点是通过只加载一个包的命令加载所有三个包.)
是否可以在Depends和Imports字段中指定包?
如果一个包在Depends中列出,是否还要在Imports中列出它?或者使用Depends已经取消了Imports的好处?
以下是否正确?当且仅当在NAMESPACE文件中导入(全部或部分)包时,才应在DESCRIPTION文件的Imports字段中列出包.
非常感谢!
大卫
如果您是一个软件包作者,当我们在大约一周内转移到2.14时,您希望很清楚包结构即将发生的变化.其中一个变化是所有包都需要一个NAMESPACE,如果您没有生成一个包,将为您生成一个(R等同于您在美国的Miranda权利).因此,作为一个好公民,我试图解决这个问题.以下是R-exts的部分:
1.6.5摘要 - 转换现有包
总而言之,将现有包转换为使用命名空间涉及几个简单的步骤:
确定公共定义并将它们放在导出指令中.识别S3样式的方法定义并编写相应的S3method声明.识别依赖项并通过import指令替换任何require调用(并在DESCRIPTION文件的Depends和Imports字段中进行适当的更改).用.onLoad函数或useDynLib指令替换.First.lib函数.
为了确保我在这里做正确的事情,有人可以给出一个简短明确的定义/答案(我是否通过将几个小但相关的问题放在一起来打破规则?).所有答案都应考虑到2.14,请:
谢谢!
我将多个绘图放在一个图像中,gridExtra::grid.arrange并且希望可以选择将组合绘图保存为可以作为返回对象列表的一部分从函数内返回的对象.理想情况下,我想在不打印绘图对象的情况下执行此操作.
下面的代码创建了两个图,将它们组合在一起grid.arrange,并尝试将结果保存到x.但是,x评估NULL并打印图表.可以使用关闭grid.arrange我的文档arrangeGrob和建议绘图plot=FALSE,但是当我尝试这个因为FALSE不是grob对象时我收到错误.
对我不理解的任何建议?
# R under development
# Windows 7 (32 bit)
# ggplot2 1.0.0
# gridExtra 0.9.1
p1 <- ggplot(mtcars, aes(x=factor(cyl), y=mpg)) + geom_boxplot()
p2 <- ggplot(mtcars, aes(x=factor(cyl), y=wt)) + geom_boxplot()
x <- gridExtra::grid.arrange(p1, p2)
x
Run Code Online (Sandbox Code Playgroud)
根据评论,我正在添加此编辑.当我尝试时arrangeGrob,我根本没有输出.
> gridExtra::arrangeGrob(p1, p2)
> print(gridExtra::arrangeGrob(p1, p2))
Error: No layers in plot
> x <- gridExtra::arrangeGrob(p1, p2)
> x
Error: No layers in …Run Code Online (Sandbox Code Playgroud) 我正在开发一个R包,需要使用snowfall包装提供的并行化.snowfall似乎没有导入同为其他包一样ggplot2,data.table等我已经包括snowfall,rlecuyer以及snow在描述文件,命名空间的文件,并在函数本身的进口参数.当我尝试访问此功能时,我收到以下错误:
Error in sfInit() : could not find function "setDefaultClusterOptions"
该sfInit函数似乎有一个nostart/ nostop参数,它表示与嵌套用法有关,sfInit但这对我来说似乎也没有.
实际的代码本身使用一个sfInit(我得到错误的地方),一些sfExports和sfLibrarys,以及一个sfLapply.
可能的解决方案:如果我snow从导入部分移动到Desciption文件中的depends部分,它似乎有效.我不知道为什么.
我有一个包在DESCRIPTION文件中包含以下包Imports:
Imports: lubridate,
assertthat,
R6,
stringr
Run Code Online (Sandbox Code Playgroud)
我不使用import(pkgname)或importFrom(pkgname, fn)命令将这些导入到我的包的NAMESPACE中.相反,我使用完全限定的调用在我的R代码中引用这些包的函数.根据我对R-ext的解读,这是允许的:
"Imports"字段列出了从其导入名称空间的包(在NAMESPACE文件中指定),但不需要附加.必须在此处列出由'::'和':::'运算符访问的命名空间...
但是,运行时出现以下错误devtools::check():
* checking dependencies in R code ... NOTE
Namespaces in Imports field not imported from:
'R6' 'stringr'
All declared Imports should be used.
See the information on DESCRIPTION files in the chapter 'Creating R
packages' of the 'Writing R Extensions' manual.
Run Code Online (Sandbox Code Playgroud)
注意:为了确认,我的R代码包含对R6和stringr中函数的完全限定调用(例如stringr::str_detect(...)和R6::R6Class(...)).
我为什么要收到这些笔记?我怎么让它们消失?
当我尝试设置一个也在另一个包中定义的方法时,我遇到了一个奇怪的问题.可以在此处找到演示此问题的示例包.
关键是typeof我尝试设置的方法.我使用setMethod函数,typeof当我构建包并在一个简单的S4类上尝试它时,它可以工作.
x <- new("A", x = 2)
typeof(x)
[1] "typeof was called"
[1] "myClassA"
Run Code Online (Sandbox Code Playgroud)
但是,如果我在加载包之前加载另一个先前也设置的包typeof(例如bigmemory),s4test如果直接调用它继续正常工作.
library(bigmemory)
library(s4test)
x <- new("A", x = 2)
typeof(x)
[1] "typeof was called"
[1] "myClassA"
Run Code Online (Sandbox Code Playgroud)
但是,如果该typeof方法是由另一个方法在内部调用的(例如,nrow请参见此处),那么它将失败并且仅返回S4
nrow(x)
[1] "A"
attr(,"package")
[1] "s4test"
Function: typeof (package base)
x="ANY"
x="big.matrix"
x="myClass"
A connection with
description "stdout"
class "terminal"
mode "w"
text "text"
opened …Run Code Online (Sandbox Code Playgroud) 我有一个使用tmPlot函数from 的包treemap,但是当我尝试使用该函数时,它会抛出一个错误,它没有加载其中一个依赖项:
Error in tmPlot(data, index = index, vSize = vSize) :
could not find function "brewer.pal"
Run Code Online (Sandbox Code Playgroud)
依赖项已安装在命名空间中.
这个问题有一些设置,是一个包问题,但我试图尽可能减少它:
确保已安装treemap(及其所有依赖项).
我做了一个名为'anRpackage'的目录.里面是一个文件夹('R')和一个带有以下文字的DESCRIPTION文件:
Package: anRpackage
Title: What the package does (short line)
Version: 1.0
Author: Who wrote it
Maintainer: Who to complain to <yourfault@somewhere.net>
Description: More about what it does (maybe more than one line)
License: What license is it under?
Imports:
treemap
Collate:
'maketree.R'
Run Code Online (Sandbox Code Playgroud)
R /文件夹里面是一个名为'maketree.R'的R文件.其内容是:
#' maketree
#'
#' @importFrom treemap tmPlot
#' @export …Run Code Online (Sandbox Code Playgroud) 创建R包时,至少有两种方法可用于引入导入包中的函数.
要么,
无论何时调用它,都使用双冒号运算符明确命名该函数package::function.
直接或通过roxygen标签添加importFrom(package, function)到NAMESPACE文件中#' @importFrom package function.
每种方法有哪些优缺点?
每种语法实现的技术差异是否存在?