我正在尝试编写一个函数来评估代码并存储结果,包括代码中发出的任何可能的条件.除了在我的函数(让我们调用它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) 我正在寻找类似于插入已经键入的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?
请考虑以下命令:
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运行,并且按预期工作.
我错过了什么或者这种行为没有记录/错误吗?
我厌倦了写作:
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.
我想的编程选择功能的列表应用于数据帧的每一列使用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_each用dplyr?注意我正在寻找dplyr答案,因为我知道如何用其他工具解决这个问题.
我确信会存在某种类型的东西(沿着rowSums等等),但我找不到任何东西.基本上,这样做:
apply(mx, 1, which.min)
Run Code Online (Sandbox Code Playgroud)
没有使用,apply所以我们可以避免调用which.min nrow(mx)时间的开销,这可能是一个很大的数字.
我认为这是非常简单的,基本上,任何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) 使问题可重现的最佳方法之一是使用其中一个内置数据集.data()然而,使用是令人沮丧的,因为没有提供关于数据集结构的信息.
如何快速查看可用数据集的结构?
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) 我一直在尝试解决有关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(),只是指定eruptions在min和max,seq()仍然不明白我的意思的faithful数据集。
我知道这seq不是ggplot2的一部分,但我想知道它是否可以继承,无论它绑定在geom_histogram()哪个内部,而后者本身是从继承的ggplot()。我只是使用了错误的语法,还是可能?