为什么在全局工作空间的函数中使用“<< - ” - 工作,而不是在包中?

时间:2015-03-31 17:00:49

标签: r data.table devtools roxygen2

我正在使用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

任何人都可以解释为什么在打包我的功能之后从未填充过视图?我已经对它进行了尽可能多的测试,对于愿意为自己尝试的人来说,我的结果应该是可重现的。 谢谢,我感谢任何反馈。

2 个答案:

答案 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 bookHow R Searches and Finds Stuff

请注意,至少可以说这样做不会被认为是一种合适的调试技术。一般来说,从不想要使用“&lt;&lt; - ”运算符。

有关调试R代码的选项,请参阅,例如this question。我特别喜欢debugonce功能。请参阅?debugonce