小编Bro*_*ieG的帖子

使用`withCallingHandlers`捕获任意条件

问题

我正在尝试编写一个函数来评估代码并存储结果,包括代码中发出的任何可能的条件.除了在我的函数(让我们调用它evalcapt)在错误处理表达式中运行的情况之外,我的工作完全正常.

问题是withCallingHandlers将继续寻找匹配的条件处理程序,如果有人在我的函数之外定义了这样的处理程序,我的函数将失去对执行的控制.以下是问题的简化示例:

evalcapt <- function(expr) {
  conds <- list()
  withCallingHandlers(
    val <- eval(expr),
    condition=function(e) {
      message("Caught condition of class ", deparse(class(e)))
      conds <<- c(conds, list(e))
  } )
  list(val=val, conditions=conds)
}

myCondition <- simpleCondition("this is a custom condition")
class(myCondition) <- c("custom", class(myCondition))
expr <- expression(signalCondition(myCondition), 25)

tryCatch(evalcapt(expr))          
Run Code Online (Sandbox Code Playgroud)

按预期工作

Caught condition of class c("custom", "simpleCondition", "condition")
$val
[1] 25

$conditions
$conditions[[1]]
<custom: this is a custom condition>
Run Code Online (Sandbox Code Playgroud)

但:

tryCatch(
  evalcapt(expr),               
  custom=function(e) stop("Hijacked `evalcapt`!")  
)
Run Code Online (Sandbox Code Playgroud)

不起作用:

Caught condition …
Run Code Online (Sandbox Code Playgroud)

exception-handling r try-catch

9
推荐指数
1
解决办法
2204
查看次数

rbind`data.tables`并保存密钥

我正在寻找类似于插入已经键入的SQL表的行为,其中添加的新行被插入到现有键中.例如,在这种情况下:

dt <- data.table(a=1:10)
setkey(dt, a)
tables()
#      NAME NROW MB COLS KEY
# [1,] dt     10 1  a    a  
dt.2 <- rbindlist(list(dt, data.table(a=1:5)))
tables()
#      NAME NROW MB COLS KEY
# [1,] dt     10 1  a    a  
# [2,] dt.2   15 1  a      
Run Code Online (Sandbox Code Playgroud)

我希望可以选择dt.2"继承"密钥(显然是使用增量数据更新)dt,而不是实际发生的密钥.

起初我对丢失密钥感到有些惊讶,但这显然是记录在案的行为.

有没有一个干净的方式这样做,而不是setkey在每次rbind/ 后调用rbindlist

indexing r data.table

9
推荐指数
1
解决办法
953
查看次数

捕获组内贪婪修饰符的奇怪行为

请考虑以下命令:

text <- "abcdEEEEfg"

sub("c.+?E", "###", text)
# [1] "ab###EEEfg"                          <<< OKAY
sub("c(.+?)E", "###", text)
# [1] "ab###EEfg"                           <<< WEIRD
sub("c(.+?)E", "###", text, perl=T)
# [1] "ab###EEEfg"                          <<< OKAY  
Run Code Online (Sandbox Code Playgroud)

第一个完全符合我的预期,基本上只匹配第一个E.第二个应该基本上与第一个相同,因为我所做的只是添加一个捕获组(虽然我没有使用它),但对于某些因为它捕获了一个额外的E.这就是说,它并不是完全贪婪的(即它是否会捕获所有的Es).即使是更奇怪,它实际上仍然匹配模式,即使sub结果表明该.+?部分被遗漏EE,而正则表达式的其余部分不再匹配.这表明在计算匹配的子表达式的长度时存在偏移问题,而不是在实际匹配中.

最后一个是完全相同但使用PCRE运行,并且按预期工作.

我错过了什么或者这种行为没有记录/错误吗?

regex r posix-ere

9
推荐指数
1
解决办法
151
查看次数

基本函数,其行为类似于`cat`但返回值而不是写入文件

我厌倦了写作:

paste(paste(letters[1:3], collapse=" "), "foo")
Run Code Online (Sandbox Code Playgroud)

为了得到:

[1] "a b c foo"
Run Code Online (Sandbox Code Playgroud)

特别是因为collapse参数必须完全打字,因为它遵循.... cat很容易做到这一点:

cat(letters[1:3], "foo")
Run Code Online (Sandbox Code Playgroud)

但不返回值(grrr).是否存在任何基本(或其他R默认预加载包)功能,其行为cat与实际返回值相同?

很明显,有几种方法可以构建这样的功能,但我无法相信没有预先存在的功能.

我刚才想到的一个可能的半好的解决方案:

paste(c(letters[1:3], "foo"), collapse=" ")
Run Code Online (Sandbox Code Playgroud)

但又因为需要完全打字而烦人collapse.

string r

9
推荐指数
1
解决办法
106
查看次数

使用dplyr :: summarize_each_的函数列表

我想的编程选择功能的列表应用于数据帧的每一列使用dplyr.为了便于说明,这是我的功能列表:

fun_list <- lapply(iris[-5], function(x) if(var(x) > 0.7) median else mean)
Run Code Online (Sandbox Code Playgroud)

我认为这会奏效:

iris %>% group_by(Species) %>% summarise_each_(funs_(fun_list), names(iris)[-5])
Run Code Online (Sandbox Code Playgroud)

根据?funs_参数应该是哪些状态,除其他外:

由...指定的函数列表函数本身,意思是

但这失败了,错误:

Error in UseMethod("as.lazy") : 
  no applicable method for 'as.lazy' applied to an object of class "function"
Run Code Online (Sandbox Code Playgroud)

似乎funs_实际上期望符号列表对应于在适当环境中定义的函数,而不是实际函数.在我的应用程序中虽然我只获取函数,而不是它们的符号名称(此外,函数可能是匿名的).

有没有一种方法来通过实际的功能,summarise_eachdplyr?注意我正在寻找dplyr答案,因为我知道如何用其他工具解决这个问题.

r dplyr

8
推荐指数
1
解决办法
1487
查看次数

哪一行没有申请

我确信会存在某种类型的东西(沿着rowSums等等),但我找不到任何东西.基本上,这样做:

apply(mx, 1, which.min)
Run Code Online (Sandbox Code Playgroud)

没有使用,apply所以我们可以避免调用which.min nrow(mx)时间的开销,这可能是一个很大的数字.

r min apply

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

在编写用于R的C函数时,究竟需要保护什么

我认为这是非常简单的,基本上,任何SEXP我创建类型对象的C代码必须受到保护,但它开始使用链表何时开始有点迷雾(对我)CAR/ CDR等我开始了与在此评论如何写R扩展:

保护R对象会自动保护相应SEXPREC中指向的所有R对象,例如受保护列表的所有元素都会自动受到保护.

这来自R Internals:

SEXPREC是一个C结构,包含如上所述的32位头,三个指针(属性,前一个和下一个节点)和节点数据......

LISTSXP:指向CAR,CDR(通常为LISTSXP或NULL)和TAG(SYMSXP或NULL)的指针.

所以我认为这意味着,如果我这样做:

SEXP s, t, u;
PROTECT(s = allocList(2));
SETCAR(s, ScalarLogical(1));
SETCADR(s, ScalarLogical(0));

t = CAR(s);
u = CADR(s);
Run Code Online (Sandbox Code Playgroud)

然后t,u并通过指向受保护列表中的对象来保护s(推论问题:有没有办法获得对象的PROTECTED状态?在Rinternals.h中看不到符合条件的任何内容).但我看到像(来自src/main/unique.c)的东西:

// Starting on line 1274 (R 3.0.2), note `args` protected by virtue of being
// a function argument

SEXP attribute_hidden do_matchcall(SEXP call, SEXP op, SEXP args, SEXP env)
{
  // ommitting a bunch of lines, and then, …
Run Code Online (Sandbox Code Playgroud)

c garbage-collection r

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

如何快速检查内置数据集(PSA)?

使问题可重现的最佳方法之一是使用其中一个内置数据集.data()然而,使用是令人沮丧的,因为没有提供关于数据集结构的信息.

如何快速查看可用数据集的结构?

r dataset

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

3D 阵列 -&gt; 应用 -&gt; 3D 阵列

apply仅在一个边距上操作时似乎不会重新组装 3D 阵列。考虑:

 arr <- array(
  runif(2*4*3), 
  dim=c(2, 4, 3), 
  dimnames=list(a=paste0("a", 1:2), b=paste0("b", 1:4), c=paste0("c", 1:3))
)
# , , c = c1
# 
#     b
# a           b1        b2        b3        b4
#   a1 0.7321399 0.8851802 0.2469866 0.9307044
#   a2 0.5896138 0.6183046 0.7732842 0.6652637
# 
# , , c = c2
#     b
# a           b1        b2        b3         b4
#   a1 0.5894680 0.7839048 0.3854357 0.56555024
#   a2 0.6158995 0.6530224 0.8401427 0.04044974
# 
# , , c = c3
# …
Run Code Online (Sandbox Code Playgroud)

r apply multidimensional-array

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

ggplot2中继承的限制是什么?

我一直在尝试解决有关ggplot2的一些问题,以及辅助参数如何从第一部分继承而来ggplot()。具体来说,如果继承是传递给该geom_***部分之外的。

我有一个数据直方图:

ggplot(data = faithful, aes(eruptions)) + geom_histogram()
Run Code Online (Sandbox Code Playgroud)

尽管默认情况下是休息时间,但它会生成一个精美的图表。在我看来(是新来的新手)geom_histogram()是从继承数据规范ggplot()。如果我想以更聪明的方式来设置休息时间,可以使用如下流程:

ggplot(data = faithful, aes(eruptions)) + 
geom_histogram(breaks = seq(from = min(faithful$eruptions), 
                            to = max(faithful$eruptions), length.out = 10))
Run Code Online (Sandbox Code Playgroud)

但是,在这里我要在需要的geom_histogram()功能内重新指定faithful$eruptions。没有重新指定,我一直无法找到一种表达方式。此外,如果我使用data =的参数geom_histogram(),只是指定eruptionsminmaxseq()仍然不明白我的意思的faithful数据集。

我知道这seq不是ggplot2的一部分,但我想知道它是否可以继承,无论它绑定在geom_histogram()哪个内部,而后者本身是从继承的ggplot()。我只是使用了错误的语法,还是可能?

eval r ggplot2

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