小编dar*_*zig的帖子

tryCatch和ggplot

tryCatch在R代码中使用了很多来捕获潜在的错误消息,但是今天我遇到了一个奇怪的问题ggplot- 我真的不知道发生了什么(即使花了一些时间在Google/SO搜索上).

ggplot调用不完整的简单示例(无添加图层):

> tryCatch(eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=wt))')), error = function(e) e)
Error: No layers in plot
Run Code Online (Sandbox Code Playgroud)

因此不会捕获错误.更多:我用ggplot类得到一个R对象:

> str(tryCatch(eval(parse(text = 'ggplot(mtcars, aes(x=hp, y=wt))')), error = function(e) e))
List of 8
 $ data       :'data.frame':    32 obs. of  11 variables:
  ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
  ..$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
  ..$ …
Run Code Online (Sandbox Code Playgroud)

error-handling r try-catch ggplot2

7
推荐指数
1
解决办法
1246
查看次数

使用roxygen记录setter函数

我有一个功能,除了attr任何R对象的唯一广告.基础演示:

#' Setter function
#' @param x an R object
#' @param value a character value to set
#' @export
`foo<-` <- function(x, value){
    attr(x, 'foo') <- value
    return(x)
}
Run Code Online (Sandbox Code Playgroud)

这有点像魅力,除了生成一个好的Rd文件,相关部分:

\usage{
  foo(var, value) <- value
}
Run Code Online (Sandbox Code Playgroud)

当然,它会在R CMD check应该运行时触发警告foo(var) <- value.

任何提示都会非常有意义!


更新:感谢richierocks似乎有一个修复

documentation setter r roxygen roxygen2

6
推荐指数
1
解决办法
1050
查看次数

ggplot2:图下方的中心图例而不是面板区域

ggplot默认情况下,面板下方的图例居中,这在某些情况下确实令人沮丧。请看下面的例子:

ggplot(diamonds, aes(cut, fill = clarity)) + geom_bar() + coord_flip() + 
  theme(legend.position = 'bottom')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

可以看出最后一个标签是从图像中裁剪出来的,尽管我们在图例的左侧有一些空白——使用它会好得多。

:如何将图例居中放置在图下方,而不是试图强制将其居中放置在面板区域下方以解决此问题?


更新:关于这个问题的进一步例子:

df <- data.frame(
    x = sample(paste('An extremely long category label that screws up legend placement', letters[1:7]), 1e3, TRUE),
    y = sample(paste('Short label', letters[1:7]), 1e3, TRUE)
    )

ggplot(df, aes(x, fill = y)) + geom_bar() + coord_flip() +
  theme(legend.position = 'bottom')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


我所做的:我可以使用legend.direction手动将图例放在面板下方并在图下方添加一些额外的边距,例如:

ggplot(diamonds, aes(cut, fill = clarity)) + geom_bar() + coord_flip() + 
  theme(legend.position  = c(0.37, -0.1),
        legend.direction = 'horizontal', …
Run Code Online (Sandbox Code Playgroud)

r legend ggplot2

6
推荐指数
2
解决办法
7458
查看次数

内存泄漏,关闭连接

我有一个R应用程序通过stdinstdout无限循环与Java守护进程交互,这似乎有一些内存泄漏.简化的R app:

while (TRUE) {
    con <- file('stdin', open = 'r', blocking = TRUE)
    line <- scan(con, what = character(0), nlines = 1, quiet = TRUE)
    close(con)
}
Run Code Online (Sandbox Code Playgroud)

这个循环最终使用越来越多的RAM,即使我gc()close(con)调用后手动操作,内存占用似乎还有一段时间,但最终会永远增长.

确认这一点的基本脚本:

Rscript --vanilla -e "while(TRUE)cat(runif(1),'\n')" | Rscript --vanilla -e "cat(Sys.getpid(), '\n');while (TRUE) {con <- file('stdin', open = 'r', blocking = TRUE);line <- scan(con, what = character(0), nlines = 1, quiet = TRUE);close(con);gc()}"
Run Code Online (Sandbox Code Playgroud)

这将启动两个R进程:一个写入stdout和另一个读取stdin连接管道(第二个打印,pid以便您可以监视相关的内存使用情况):

在此输入图像描述

我不确定我做错了什么,但我很乐意阻止这种内存泄漏,所以任何帮助都会受到高度赞赏.

connection stdin memory-leaks r

6
推荐指数
1
解决办法
168
查看次数

`with`用法里面的功能(包装)

我想写周围的自定义功能的包装,需要一些矢量作为输入(如:mtcars$hp,mtcars$am等),以获得输入作为数据帧的名称(如data参数,如:mtcars)和变量名(如:hpam),和往常一样在大多数标准功能.

但我有一些问题,我建议的'演示'功能(包装mean不起作用.

码:

f <- function(x, data=NULL) {
    if (!missing(data)) {
        with(data, mean(x))
    } else {
        mean(x)
    }
}
Run Code Online (Sandbox Code Playgroud)

对矢量运行当然是有效的:

> f(mtcars$hp)
[1] 146.69
Run Code Online (Sandbox Code Playgroud)

with不幸的是失败了:

> f(hp, mtcars)
Error in with(d, mean(x)) : object 'hp' not found
Run Code Online (Sandbox Code Playgroud)

在全球环境中/没有我的自定义功能正常工作:

> with(mtcars, mean(hp))
[1] 146.69
Run Code Online (Sandbox Code Playgroud)

我试图做一些实验substitute,deparse和其他人,但没有成功.任何提示都会受到欢迎!

r function wrapper

5
推荐指数
1
解决办法
194
查看次数

关于屏蔽功能的静音消息

我试图压制消息,解释某些功能被其他软件包掩盖.我尝试了不同的组合,但没有一个提供我需要的东西.

我的块是:

<<loadpkgs, echo=FALSE, warning=FALSE, message=FALSE>>=
suppressPackageStartupMessages(library(doMC))
suppressPackageStartupMessages(library(aroma.affymetrix))
suppressPackageStartupMessages(library(crlmm))
suppressPackageStartupMessages(library(snpStats))
suppressPackageStartupMessages(library(pd.genomewidesnp.6))
suppressPackageStartupMessages(library(GenomicRanges))
suppressPackageStartupMessages(library(ggbio))
@ 
Run Code Online (Sandbox Code Playgroud)

但是输出(我希望没有)是(在得到的PDF上):

## Loading required package:  foreach
## foreach:  simple, scalable parallel programming from Revolution Analytics
## Use Revolution R for scalability, fault tolerance and more.
## http://www.revolutionanalytics.com
## Loading required package:  iterators
## Loading required package:  parallel
## Loading required package:  R.utils
## Loading required package:  R.oo
## Loading required package:  R.methodsS3
## R.methodsS3 v1.5.2 (2013-10-06) successfully loaded.  See ?R.methodsS3 for help.
## R.oo v1.15.8 (2013-10-10) …
Run Code Online (Sandbox Code Playgroud)

r knitr

5
推荐指数
2
解决办法
2936
查看次数

从文档中获取函数的标题

我想rnorm在我的脚本之一中获得基本函数的标题(例如:)。这包含在文档中,但我不知道如何“抓住”它。

我的意思是RD文件中给出的行\title{}或文档中的顶行。

有没有简单的方法可以做到这一点,而无需调用Rd_db函数tools并解析所有 RD 文件——因为这个简单的东西会产生很大的开销?其他事情:我也尝试过parse_Rd,但是:

  • 我不知道哪个Rd文件包含我的功能,
  • 我的系统上没有Rd文件(只有rdbrdxrds)。

因此,解析(离线)文档的函数将是最好的:)


概念验证演示:

> get.title("rnorm")
[1] "The Normal Distribution"
Run Code Online (Sandbox Code Playgroud)

documentation r

4
推荐指数
1
解决办法
343
查看次数