如果我有两个使用相同变量名的嵌套环境,我如何获取外部环境的值?
我很难搞清楚实现这个的正确方法.我已经尝试了eval中的一些变体parent.frame(x)和sys.frame(x)内部.任何建议,将不胜感激.
例:
outerFunc <- function() {
obj <- "Outer Object"
innerFunc()
}
innerFunc <- function() {
# A local variable with same name is created
obj <- "Inner Object"
# would like to grab the value of obj from the outer environment
obj.callingFunc <- eval(obj, envir=sys.frame(-1))
cat(obj.callingFunc) # gives "Inner Object" instead of "Outer Object"
}
> outerFunc()
Inner Object
Run Code Online (Sandbox Code Playgroud)
obj在这种特定情况下,我无法使用明显的解决方案(明确传递.使用不同的变量名称等).
在下面查看@ GregSnow和@Dwin的答案
# THESE WORK
eval(quote(obj), envir=parent.frame()) # equivalent to evalq(obj, envir=parent.frame()) …Run Code Online (Sandbox Code Playgroud) 我正在处理一个抛出错误和警告的函数. (相关:关于警告的警告)
通常,警告会发生错误.在这些情况下,我想忽略警告并仅处理错误.
另一方面,如果只有一个警告(没有错误),那么我想抓住警告.
我试图使用臭名昭着的易用tryCatch.
我当前的问题是:有没有办法强制tryCatch在errors之前处理warnings(或在出现错误时忽略警告)?
我从?tryCatch文档中得到的理解是条件处理FIFO,在这种情况下,我的直接问题的答案是否 - 至少不是直接的.在这种情况下,是否可以处理警告,然后在仍然捕获错误的同时继续执行该功能?
解决方案不适用于我:
suppressWarnings #我还想抓住并处理警告options(warn=2) #某些警告是无害的Run Code Online (Sandbox Code Playgroud)relevant from `?tryCatch`如果在评估expr时发出条件信号,那么从最近建立的处理程序开始检查已建立的处理程序,以匹配条件的类.当在一个tryCatch中提供多个处理程序时,第一个被认为比第二个更新.如果找到一个处理程序,则控制转移到建立处理程序的tryCatch调用,找到处理程序并解除所有更新的处理程序,以条件作为其参数调用处理程序,并且处理程序返回的结果返回为tryCatch调用的值.
F.errorAndWarning <- function() {
warning("Warning before the error")
cat("I have moved on.")
stop("error")
TRUE
}
F.error <- function() {stop("error"); TRUE}
test <- function(F)
tryCatch(expr= {F}()
, error=function(e) cat("ERROR CAUGHT")
, warning=function(w) cat("WARNING CAUGHT")
)
test(F.error)
# ERROR CAUGHT
test(F.errorAndWarning)
# WARNING CAUGHT
Run Code Online (Sandbox Code Playgroud)
预期/理想输出:
test(F.errorAndWarning)
# ERROR CAUGHT
Run Code Online (Sandbox Code Playgroud) 我个人认为这个问题是重复的,因为这个问题似乎与@ TylerRinker的问题几乎相同.但是,我仍然认为这个具体问题没有答案.虽然我喜欢debug/debugonce那些不同的(虽然非常有用)工具,但我仍然对如何控制browser上下文感到好奇.
在调试时,browser从另一个browser上下文中进入上下文很容易并且通常很有帮助.当从迭代循环调用嵌套级别时,退出到前一个上下文需要单步执行每次迭代.退出所有上下文的Q退出. browser
有没有办法指定要退出的上下文而无需在较低的上下文中手动进行所有迭代?
在下面的例子中,这意味着回到Browse [1]无需打c100次
我使用的两个要么是
(1)修改迭代次数,要么
(2)使用Q,再次调用我的原始函数,然后前进到我以前的位置.
既不构成"伟大",也不构成"好".
例:
outerFunc <- function() {
# < ... cropped .. >
browser()
# < ... cropped .. >
}
outerFunc()
lapply(seq(100), function(i) browser(text=paste("i is #", i)))
Run Code Online (Sandbox Code Playgroud)
> outerFunc()
Called from: outerFunc()
Browse[1]> lapply(seq(100), browser)
Called from: lapply(seq(100), browser)
Browse[2]> c
Called from: lapply(seq(100), …Run Code Online (Sandbox Code Playgroud) 通常,当我运行基准测试时,我将我的语句包装起来expression.最近,有人建议(a)不这样做或(b)使用quote而不是表达.
我发现包装语句有两个好处:
然而,在探索不同的方法时,我注意到三种方法之间存在差异(包装expression,包装quote或不包装)
问题是:
为什么要有差异?
(似乎包装quote并不会实际评估呼叫.)
# SAMPLE DATA
mat <- matrix(sample(seq(1e6), 4^2*1e4, T), ncol=400)
# RAW EXPRESSION TO BENCHMARK IS:
# apply(mat, 2, mean)
# WRAPPED EXPRESSION:
expr <- expression(apply(mat, 2, mean))
quot <- quote(apply(mat, 2, mean))
# BENCHMARKS
benchmark(raw=apply(mat, 2, mean), expr, quot)[, -(7:8)]
# test replications elapsed relative user.self sys.self
# 2 expr 100 1.269 NA 1.256 0.019
# 3 quot 100 0.000 NA …Run Code Online (Sandbox Code Playgroud) 有没有办法在R中创建颜色序列?
例如,类似于:
seq("#000000", "#999999", length=20)
Run Code Online (Sandbox Code Playgroud) 我试图覆盖两个不同的情节.一个是geom_boxplot另一个geom_jitter.我希望每个人都有自己的色标.但是当我添加第二个色标时,我得到了错误
"Scale for 'fill' is already present. Adding another scale for 'fill',
which will replace the existing scale."
Run Code Online (Sandbox Code Playgroud)
我假设我做错了什么.任何建议都会很感激
这是我的工作代码的一个粗略示例:
P <- ggplot(dat) +
geom_boxplot(aes(x=ve, y=metValue, fill=metric), alpha=.35, w=0.6, notch=FALSE, na.rm = TRUE) +
scale_fill_manual(values=cpalette1) +
geom_hline(yintercept=0, colour="#DD4466", linetype = "longdash") +
theme(legend.position="none")
P + geom_jitter(dat2, aes(x=ve, y=metValue, fill=atd),
size=2, shape=4, alpha = 0.4,
position = position_jitter(width = .03, height=0.03), na.rm = TRUE) +
scale_fill_manual(values=cpalette2)
Run Code Online (Sandbox Code Playgroud)
dat并dat2具有相同的架构,但具有不同的值.
我找到了几个解决叠加图的例子,但似乎都没有解决这个特定的问题.
我有一个很大的for循环循环数百次,最后会产生这个警告:
Warning messages:
1: In min(j, na.rm = TRUE) :
no non-missing arguments to min; returning Inf
Run Code Online (Sandbox Code Playgroud)
有什么办法我可以问R生成警告信息的哪一行?
OP的评论如下:"我不直接将min作为一条线.它可能嵌套在其他函数中,我不会问这个问题,因为我知道这是来自min的问题."
我试图在R中使用几个foreach循环来并行填充一个公共数组.我想要做的一个非常简化的版本是:
library(foreach)
set.seed(123)
x <- matrix(NA, nrow = 8, ncol = 2)
foreach(i=1:8) %dopar% {
foreach(j=1:2) %do% {
l <- runif(1, i, 100)
x[i,j] <- i + j + l #This is much more complicated in my real code.
}
}
Run Code Online (Sandbox Code Playgroud)
我想编码x并行更新矩阵,输出如下:
> x
[,1] [,2]
[1,] 31.47017 82.04221
[2,] 45.07974 92.53571
[3,] 98.22533 12.41898
[4,] 59.69813 95.67223
[5,] 63.38633 55.37840
[6,] 102.94233 56.61341
[7,] 78.01407 69.25491
[8,] 26.46907 100.78390
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法弄清楚如何更新阵列.我试过把x <-它放到其他地方,但它似乎不喜欢它.我认为这将是一个非常容易解决的问题,但我所有的搜索还没有把我带到那里.谢谢.
我只是做了一些基准测试,而试图优化一些代码,并指出,strsplit与perl=TRUE是快比跑步strsplit用perl=FALSE.例如,
set.seed(1)
ff <- function() paste(sample(10), collapse= " ")
xx <- replicate(1e5, ff())
system.time(t1 <- strsplit(xx, "[ ]"))
# user system elapsed
# 1.246 0.002 1.268
system.time(t2 <- strsplit(xx, "[ ]", perl=TRUE))
# user system elapsed
# 0.389 0.001 0.392
identical(t1, t2)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
所以我的问题(或者更确切地说是标题中的问题的变体)是,在什么情况下绝对需要perl=FALSE(省略fixed和useBytes参数)?换句话说,我们不能用perl=TRUE它做什么可以通过设置来完成perl=FALSE?
我有一组格式的数据:
ID Minutes Value
xxxx 118 3
xxxx 121 4
xxxx 122 3
yyyy 122 6
xxxx 123 4
yyyy 123 8
... ... ....
Run Code Online (Sandbox Code Playgroud)
每个ID都是患者,每个值都是,例如,该分钟的血压.我想在每个点之前60分钟和每个点之后60分钟创建一个滚动平均值.但是 - 你可以看到,有缺失分钟(所以我不能仅仅用行号),我想每一个唯一的ID(所以平均ID XXXX不能包括分配给ID YYYY值)创建平均值.听起来像rollapply或者rollingstat可能是选择,但是试图将它拼凑在一起却没什么成功......
如果需要进一步说明,请告诉我.
r ×10
benchmarking ×1
color-picker ×1
color-scheme ×1
colors ×1
debugging ×1
expression ×1
foreach ×1
ggplot2 ×1
pcre ×1
regex ×1
time-series ×1
try-catch ×1