小编Jor*_*eys的帖子

在R中安全地创建S3 Generics

Henrik Bengtsson为互联网提供了一种在R创建S3泛型的好方法,而不必担心它们是否在2002年之前创建过.

他的函数setGenericsS3的作用基本上是:

  • 检查名称是否正常
  • 检查是否存在具有该名称的功能

如果是这样,

  • 检查它是否是通用的
  • 如果不是,请将其重命名为.default并创建泛型

如果没有,只需创建通用.

事实证明,当您自己的软件包中没有可用的代码时,自动创建泛型非常有用.当我们走过这个R时代时,我想知道现在在R中实现相同的正确方法是什么.我isS3Generic()在R中找不到或类似的函数,Henrik Bengtsson的代码源自R 2.14中引入的强制命名空间.我记得我已经看到了实现同样目标的其他方法,但找不到它们.

编辑:我特意找S3.该功能isGeneric()仅适用于S4,例如anova(用于S3通用):

> isGeneric('anova')
[1] FALSE
> anova
function (object, ...) 
UseMethod("anova")
<bytecode: 0x04dc7a18>
<environment: namespace:stats>
Run Code Online (Sandbox Code Playgroud)

generics r r-s3

33
推荐指数
1
解决办法
974
查看次数

在R中显示状态消息

我想编写一个向用户显示状态消息的函数,该消息显示时间,完成百分比和进程的当前状态.我可以处理组合消息,但我想做的事情不仅仅是打印到控制台并让它向上滚动,一个消息接着另一个.我真的很喜欢在不滚动message()和没有任何图形的情况下更改消息.这可能与R?

message r status statusbar

30
推荐指数
4
解决办法
2万
查看次数

R中的内存分析 - 用于汇总的工具

R有一些内存分析工具,比如 Rprofmem(),Rprof()选项"memory.profiling=TRUE"tracemem().最后一个只能用于对象,因此可以跟踪复制对象的次数,但不提供基于函数的概述.Rprofmem应该能够做到这一点,但即使是最简单的函数调用的输出也会lm()提供超过500行的日志.我试图找出究竟Rprof("somefile.log",memory.profile=T)做了什么,但我不认为我真的明白了.

我能找到的最后一个是托马斯·拉姆利的这个消息,说道,我引述:

我还没有工具来总结输出.

这是在2006年也有一些不错摘要选择现在任何机会,主要是基于Rprofmem(),神秘的输出Rprof()memory.profile设置为TRUE或任何其他工具?

r memory-profiling r-faq

29
推荐指数
1
解决办法
2348
查看次数

覆盖在命名空间中导入的函数

由于termplotR中的函数包含一些令我烦恼的错误的奇怪代码,我想在我自己的测试代码中覆盖它,直到我找到一个更永久的解决方案.问题是mgcv包没有加载更改的功能.该mgcvimportFrom()在NAMESPACE文件中使用其名称空间中的stats包加载termplot .

我怎样才能说服mgcv使用改变的termplot?我试过了 :

unlockBinding("termplot", as.environment("package:stats"))
assign("termplot", my.termplot, as.environment("package:stats"))
lockBinding("termplot", as.environment("package:stats"))
Run Code Online (Sandbox Code Playgroud)

当应用于lm-objects时,这个工作并且使用改变的termplot.但是当使用mgcv包生成的gam-object时,这不起作用.如果我可以避免它,我真的不会从源代码构建stats包...

为了澄清,我也试过了

assignInNamespace("termplot", my.termplot, ns="stats")
assignInNamespace("termplot", my.termplot, ns="mgcv")
Run Code Online (Sandbox Code Playgroud)

在所有可能的组合中,在附加mgcv之后,在附加mgcv之后,我没有设法让它工作.


编辑:

我尝试了这里给出的所有选项(除了重建任何一个包),并且无法让它工作.对我来说简单的方法是使用包装函数.这个讨论可以在这里找到.感谢所有的提示.


一个可重复的例子:

my.termplot <- function (x) print("my new termplot")

  unlockBinding("termplot", as.environment("package:stats"))
  assignInNamespace("termplot", my.termplot, ns="stats", envir=as.environment("package:stats"))
  assign("termplot", my.termplot, as.environment("package:stats"))
  lockBinding("termplot", as.environment("package:stats"))


y <- 1:10
x <- 1:10
xx <- lm(y~x)
termplot(xx)
require(mgcv)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2)
b <- gam(y ~ s(x0) + …
Run Code Online (Sandbox Code Playgroud)

namespaces r function package

28
推荐指数
1
解决办法
8246
查看次数

使用R中的工具提示创建pdf

简单问题:有没有办法在pdf文件中绘制R图并包含工具提示?

pdf r tooltip

27
推荐指数
1
解决办法
5916
查看次数

测试NA并根据结果选择值

我的问题很简单.我想要的是A[i]!=NA,然后C[i]=A[i],A[i]=NA然后C[i]=B[i],然而,我总是得到一些错误消息.有人可以帮帮我吗?

A   B   C
NA  82.6    .
NA  127.2   .
NA  93.6    .
NA  105 .
NA  104 .
NA  90.6    .
NA  95.8    .
NA  103 .
NA  85.4    .
NA  81.5    .
NA  142.8   .
NA  102.3   .
NA  104 .
NA  103 .
NA  94.6    .
NA  113.8   .
NA  113.5   .
NA  74.5    .
NA  123.8   .
NA  94  .
NA  89.8    .
NA  74  .
NA  104 …
Run Code Online (Sandbox Code Playgroud)

if-statement r na

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

在系统R中连接两个或多个数据帧

我的问题是如何在系统R中加入两个或多个数据帧?

例如:

我有两个数据框:

第一:

   x  y  z
1  3  2  4
2  4  5  7
3  5  6  8
Run Code Online (Sandbox Code Playgroud)

第二:

   x  y  z
1  1  1  1
2  4  5  7
Run Code Online (Sandbox Code Playgroud)

我需要这个:

   x  y  z
1  3  2  4
2  4  5  7
3  5  6  8
4  1  1  1
5  4  5  7
Run Code Online (Sandbox Code Playgroud)

我试图为每个向量使用append,如下所示:

for(i in 1:length(first)){

    mix[[i]]<-append(first[i], second[i])}
Run Code Online (Sandbox Code Playgroud)

f <-do.call(rbind,mix)

但它不像我需要的那样工作.我没有得到我的矩阵,我有一些不同的结构.

join r dataframe rbind

20
推荐指数
1
解决办法
2万
查看次数

捕获R中系统调用的退出状态和输出

我已经打了一下,与system()system2()欢乐,我突然想到我能救输出或在对象退出状态.玩具示例:

X <- system("ping google.com",intern=TRUE)
Run Code Online (Sandbox Code Playgroud)

给我输出,而

X <- system2("ping", "google.com")
Run Code Online (Sandbox Code Playgroud)

给我退出状态(在这种情况下为1,谷歌不接受ping).如果我想要输出和退出状态,我必须进行2次系统调用,这看起来有点矫枉过正.如何只使用一个系统调用?

编辑:我想在控制台中同时使用两者,如果可能的话,不通过stdout="somefile.ext"system2调用中使用临时文件并随后读取它.

linux r system call

18
推荐指数
3
解决办法
9217
查看次数

data.table中的子集

我试图在R(而不是data.frame)中对data.table(来自包data.table)进行子集化.我有一个4位数的年份作为关键.我想通过一系列的几年来分组.例如,我想要提取1999年,2000年,2001年的所有记录.

我试过传递DT[J(year)]以下二进制搜索语法:

1999,2000,2001
c(1999,2000,2001)
1999, 2000, 2001
Run Code Online (Sandbox Code Playgroud)

但这些似乎都不起作用.任何人都知道如何做一个子集,你想要选择的年份不只是1年,而是多年?

r subset data.table

17
推荐指数
3
解决办法
5万
查看次数

快速计算R中的双积分

我正在寻找一个比双重积分更快的解决方案

integrate(function(y) { 
   sapply(y, function(y) {
     integrate(function(x) myfun(x,y), llim, ulim)$value
   })
 }, llim, ulim)
Run Code Online (Sandbox Code Playgroud)

用例如

myfun <- function(x,y) cos(x+y)
llim <- -0.5
ulim <- 0.5
Run Code Online (Sandbox Code Playgroud)

我找到了一篇旧论文,提到了一个名为FORTRAN的程序quad2d,但我找不到其他任何东西,除了一些matlab的帮助页面.所以我正在寻找一个可以快速进行双积分的C或FORTRAN库(即没有sapply循环),并且可以从R调用.所有想法都非常受欢迎,只要它们都是GPL兼容的.

如果解决方案涉及从R已经附带的库中调用其他功能,我也很乐意听取他们的意见.

c fortran r integral

16
推荐指数
2
解决办法
2万
查看次数