我正在使用devtools和roxygen2(在RStudio中)创建一个包,但是在我构建了包后,我的功能不再按预期工作。然而,如果我加载函数的.R文件并从RStudio中运行该函数,它可以完美地工作。我之前使用此方法创建了另一个包,它工作正常(13个函数全部按照我的其他包的方式工作),但我似乎无法使这个新工作。
要开始创建包,请从:
开始library("devtools")
devtools::install_github("klutometis/roxygen")
library(roxygen2)
setwd("my parent directory")
create("triale")
到目前为止一切正常。所以我将包含我的函数的.R文件放在triale文件夹下的R文件夹中。 .R文件如下所示:
#' Trial Z Function
#'
#' This function counts the values in the columns
#' @param x is the number
#' @keywords x
#' @export
#' @examples
#' trialz()
trialz = function(x) {w_id= c(25,x,25,25,25,1,1,1,1,1);
wcenter= c(rep("BYSTAR-1",10));
df1 <<- data.frame(w_id, wcenter);
countit <<- data.table(df1);
view <<- countit[, .N, by = list(w_id, wcenter)];
View(view)}
再次,如果我只是从.R文件运行代码,并测试该函数它工作正常。但要继续,接下来我输入:
setwd("./triale")
document()
更新triale文档,加载triale,并编写NAMESPACE和trialz.Rd,以便trialz.Rd位于man文件夹下,NAMESPACE位于triale文件夹下。接下来我安装triale:
setwd("..")
install("triale")
我知道的是有效的,因为我得到以下内容:
Installing triale
"C:/PROGRA~1/R/R-31~1.3/bin/x64/R" --vanilla CMD INSTALL \
"C:/Users/grice/Documents/R/triale" \
--library="C:/Users/grice/Documents/R/win-library/3.1" --install-tests
* installing *source* package 'triale' ...
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
*** arch - i386
*** arch - x64
* DONE (triale)
Reloading installed triale
现在已经构建了包,因此我执行以下操作:
library("triale")
library("data.table")
注意每当我加载数据包data.table时,我都会收到以下错误消息:
data.table 1.9.4 For help type: ?data.table
*** NB: by=.EACHI is now explicit. See README to restore previous behaviour.
然而它似乎并没有影响我的功能。现在是时候从我的包中测试我的功能了:
trialz(25)
这样,我当然得到一个填充的df1和countit,但无论出于什么原因,视图总是空的(如0个变量中的0个障碍)。
所以我使用下面的虚拟代码测试我的工作:
>trialy = function(x) {wid= c(25,x,25,25,25,1,1,1,1,1);
wc= c(rep("BYSTAR-1",10));
df2 <<- data.frame(wid, wc);
countitt <<- data.table(df2);
viewer <<- countitt[, .N, by = list(wid, wc)];
View(viewer)}
>trialy(25)
尽管这是完全相同的代码,只是改变了名称,但它才有效。目瞪口呆我打开trialz.R并从那里复制该功能并运行如下,这是有效的:
> trialz = function(x) {w_id= c(25,x,25,25,25,1,1,1,1,1);
wcenter= c(rep("BYSTAR-1",10));
df1 <<- data.frame(w_id, wcenter);
countit <<- data.table(df1);
view <<- countit[, .N, by = list(w_id, wcenter)];
View(view)}
> trialz(25)
因为在我知道我的方法是可靠的之前我已经创建了一个包(该包有13个不同的函数,所有这些都有效)。我只是不理解函数如何在编写时正常工作,但是当我打包它时,函数不再有效。 这里再次使用我的包时停止工作:
view <<- countit[, .N, by = list(w_id, wcenter)];
View(view)}
如果我的包装有效,我的最终结果应该是这样的:
wid wc N
1 25 BYSTAR-1 5
2 1 BYSTAR-1 5
任何人都可以解释为什么在打包我的功能之后从未填充过视图?我已经对它进行了尽可能多的测试,对于愿意为自己尝试的人来说,我的结果应该是可重现的。 谢谢,我感谢任何反馈。
答案 0 :(得分:0)
我在编辑我的描述文件时忘记了一个重要的部分,因为我要添加
Imports: data.table
NAMESPACE文件也需要包含data.table包作为导入,如下所示:
import(data.table)
export(Z)
export(AS) .... etc.
这样做可确保只要包中的函数使用另一个包中的函数,就会在执行代码之前调用该(第二个)包。
答案 1 :(得分:0)
您的问题是“&lt;&lt; - ”不会在全局环境中创建变量,而是在父环境中创建变量。 (见help("<<-")
。)
函数的父环境是定义它的环境。在您直接在工作空间中定义函数的情况下,此父环境实际上与工作空间环境相同(即:.GlobalEnv
),这就是为您的变量分配预期值的原因。但是,在打包函数的情况下,父环境是包环境而不是 .GlobalEnv
!这就是您没有在工作区中看到变量被赋值的原因。
有关R。
中的环境的详细信息,请参阅the chapter on environments in Hadley's book和How R Searches and Finds Stuff请注意,至少可以说这样做不会被认为是一种合适的调试技术。一般来说,从不想要使用“&lt;&lt; - ”运算符。
有关调试R代码的选项,请参阅,例如this question。我特别喜欢debugonce
功能。请参阅?debugonce
。