在R 3.6.0(预发布)中,我只有 data.table包中的内存泄漏.这发生在CRAN版本以及GH版本上.
require(data.table)
n <- 2e6
df <- data.frame(a=rnorm(n),
b=factor(rbinom(n,5,prob=0.5),1:5,letters[1:5]),
c=factor(rbinom(n,5,prob=0.5),1:5,letters[1:5]))
dt <- setDT(df)
print(pryr::mem_used())
fff <- function(aref) {
ff <- lapply(1:5, function(i) {
dt2 <- dt[,list(sumA=sum(get(aref))),by=b][,c:=letters[i]]
dt2
})
return(rbindlist(ff))
}
for(i in 1:10) {
f <- fff("a")
rm("f")
gc()
print(pryr::mem_used())
}
gc()
print(pryr::mem_used())
Run Code Online (Sandbox Code Playgroud)
退货(仅限 3.6.0 )
81.2 MB
81.2 MB
81.2 MB
184 MB
287 MB
390 MB
493 MB
596 MB
699 MB
802 MB
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
"get"和"by"的调用似乎都是必要的.`[,c:= letters [i]]不是,但它使内存泄漏显得更快.
我的会话信息
> sessionInfo()
R Under development …Run Code Online (Sandbox Code Playgroud) 我想使用 roxygen2 导出一个名为 [.myclass 的 S3method,但我看不到一种干净的方法来做到这一点。
我需要 NAMESPACE
S3method("[",myclass)
Run Code Online (Sandbox Code Playgroud)
在其中或在我需要该包后无法使用该方法,但 roxygen2 似乎不想帮助我解决这个问题。
我可以强迫它
#' @S3method [ myclass
setMethodS3("[",
c(x="myclass"),
function(x,i) {
blah blah balh
})
Run Code Online (Sandbox Code Playgroud)
但是 roxygen 然后说 s3method 已弃用,我应该改用 @export,但是
#' @export
setMethodS3("[",
c(x="myclass"),
function(x,i) {
blah blah balh
})
Run Code Online (Sandbox Code Playgroud)
只是不这样做。(在 NAMESPACE 中放置一个空的导出)。
我问了包的作者,他建议我使用@method 和@export,但这也不起作用
#' @method [ myclass
#' @export
setMethodS3("[",
c(x="myclass"),
function(x,i) {
blah blah balh
})
Run Code Online (Sandbox Code Playgroud)
在 NAMESPACE 中也以“export()”结尾
我错过了什么?
我有一个我想从构建中排除的小插图。是的,我可以删除它,但我认为 .Rbuildignore 应该在这里帮助我。我在 .Rbuildignore 中引用了该文件,但它并没有出现在包中。但是,R CMD check 给出了警告:
* checking 'build' directory ... WARNING
Output(s) listed in 'build/vignette.rds' but not in package:
'inst/doc/ignoreMe.pdf'
Run Code Online (Sandbox Code Playgroud)
这是一个相关的问题R CMD build skips knitr/Rmd vignettes - “Output(s)列出在'build/vignette.rds'中但不在包中”仅,我希望忽略小插图(并且当它不生成警告时它被忽略)。那可能吗?
在指向 .Rbuildignore的Writing R Extensions索引链接中似乎没有提到这一点。
我为什么要这样做?我的开发周期使版本n得到完善,而版本n +1 正在开发中。这个小插图是n +1 的一部分,.Rbuildignore 帮助我排除该版本中的所有其他内容。
当我尝试从0-cloud安装软件包时,它不起作用
> install.packages("lfactors")
--- Please select a CRAN mirror for use in this session ---
Run Code Online (Sandbox Code Playgroud)
然后我从存储库列表中选择0-cloud.和R返回
Warning: unable to access index for repository https://cran.rstudio.com/src/contrib
Warning: unable to access index for repository https://cran.rstudio.com/bin/windows/contrib/3.2
Warning message:
package ‘lfactors’ is not available (for R version 3.2.1)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码并选择另一个存储库时,它确实有效.
我尝试关闭我的代理服务器,并在代理服务器上访问该网站,我可以在浏览器中访问它,没有任何问题.
有任何想法吗?
编辑:基于评论,我跑了这个
capabilities()["libcurl"]
libcurl
TRUE
Run Code Online (Sandbox Code Playgroud)
所以我认为不是那样的.
我有一个调用对象,我想添加一个参数,并且我不想像这个答案那样使用解析。
所以,假设我有一个lm对象,那么来自lm
lma <- lm(mpg ~ cyl, data=mtcars)
lma$call
# lm(formula = mpg ~ cyl, data = mtcars)
Run Code Online (Sandbox Code Playgroud)
weights=wt现在,假设我想使用调用添加一个参数。我意识到有一种非常简单的方法来创建新的调用,但我想知道我是否可以使用调用对象。weights如果它已经在那里,还有一种编辑方法
lmb <- lm(mpg ~ cyl, data=mtcars, wei=wt)
cl <- lmb$call
wtpos <- which.max(pmatch(names(cl), "weights"))
cl[[wtpos]] <- mtcars$qsec
eval(cl)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,lma$call因为 中没有权重参数lma$call。
所以,感觉我应该能够通过添加另一个元素来简单地“增长”调用,但我不知道该怎么做。例如,以下情况会失败:
cl <- lma$call
cl <- c(cl, weights=quote(wt))
eval(cl)
# [[1]]
# lm(formula = mpg ~ cyl, data = mtcars)
#
# $weights
# wt
Run Code Online (Sandbox Code Playgroud)
所以,我希望结果是一个等于 的新“lm”对象lmb,而不仅仅是一个列表。 …