如何从summaryRprof制作情节?

时间:2011-01-15 03:39:42

标签: r

这是大学任务的问题。

我有三种算法来计算我已经做过的GCD。我的问题是将Rprof结果变成一个图,所以我可以将它们并排比较。

根据对Rprof的简要理解,summaryRprof和plot是Rprof的使用方式如下:

Rprof() #To start
#functions here
Rprof(NULL)  #TO end
summaryRprof() # to print results

我知道情节有很多不同类型的输入,x和y值以及一些叫做数据框的东西,我认为这是一个奇特的表格。并绘制我需要使用的不同行和事物:http://www.harding.edu/fmccown/r/

我无法弄清楚如何将summaryRprof结果传递给plot()函数。

> Rprof(filename="RProfOut2.out", interval=0.0001)
> gcdBruteForce(10000, 33)
[1] 1
> gcdEuclid(10000, 33)
[1] 1
> gcdPrimeFact(10000, 33)
[1] 1
> Rprof(NULL)
> summaryRprof()
?????plot????

我一直在阅读堆栈溢出和其他网站,我也可以尝试使用profr和proftools,虽然我对使用情况不是很清楚。

我能够制作的唯一图表是使用绘图(system.time(gcdFunction(10,100)))

一如往常,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:6)

有两个可视化Rprof输出的包:

在安装了graphviz的Unix / OS X系统上,您可以使用R Wiki page on profiling上的Romain Francois的一个漂亮的Perl脚本。

所有这些都是通过我的 HPC简介与R 教程中的示例进行描述的,例如,您可以找到here

答案 1 :(得分:3)

gcd函数必须是你单独编码的东西,因为它们不是base R的一部分。这是一个人为的例子,向你展示如何将数据转换成可用的格式以便进一步处理和绘图。

首先,您需要传递summaryRprof()个文件名来处理。在您的示例中,这将是summaryRprof("RProfOut2.out")

这将返回您之前代码的摘要统计信息。由于我们需要对这些统计信息进行进一步处理,因此我们将其分配给一个新对象:

sumStats <- summaryRprof("RProfOut2.out")

这将返回一个包含4个元素的列表对象:

> str(sumStats)
List of 4
 $ by.self        :'data.frame':    2 obs. of  4 variables:
  ..$ self.time : num [1:2] 1.97 0.25
  ..$ self.pct  : num [1:2] 88.7 11.3
  ..$ total.time: num [1:2] 1.97 0.25
  ..$ total.pct : num [1:2] 88.7 11.3
 $ by.total       :'data.frame':    3 obs. of  4 variables:
  ..$ total.time: num [1:3] 1.97 0.25 0
  ..$ total.pct : num [1:3] 88.7 11.3 0
  ..$ self.time : num [1:3] 1.97 0.25 0
  ..$ self.pct  : num [1:3] 88.7 11.3 0
 $ sample.interval: num 1e-04
 $ sampling.time  : num 2.22

此时,我假设您将对前两个data.frames之一感兴趣。我更喜欢ggplot2中的图形而不是基本图形,但你可以通过基本图形实现大多数事情...我只是拥有ggplot2的更多经验。这是一种绘制生成的by.self()数据帧的数据的方法:

require(ggplot2)

byself <- sumStats$by.self

byself$functions <- rownames(byself)

m <- melt(byself, id.var = "functions")

qplot(functions, value, data = m, fill = variable, geom = "bar", position = "dodge")

这使得情节看起来像这样: alt text

为了完整起见,这里是我为这个例子编写的人为代码。我知道不是很有创意,但是完成了工作:

Rprof("Rprof.out", interval = 0.0001)
x <- rnorm(10000000)
y <- x ^ 2
Rprof(NULL)
sumStats <- summaryRprof("Rprof.out")