小编Ric*_*rta的帖子

范围 - 如果存在具有相同名称的本地var,如何在父环境中评估对象?

如果我有两个使用相同变量名的嵌套环境,我如何获取外部环境的值?

我很难搞清楚实现这个的正确方法.我已经尝试了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)

r environment-variables

10
推荐指数
1
解决办法
1574
查看次数

在tryCatch中警告之前处理错误

我正在处理一个抛出错误和警告的函数. (相关:关于警告的警告)

通常,警告会发生错误.在这些情况下,我想忽略警告并仅处理错误.

另一方面,如果只有一个警告(没有错误),那么我想抓住警告.

我试图使用臭名昭着的易用tryCatch.

我当前的问题是:有没有办法强制tryCatcherrors之前处理warnings(或在出现错误时忽略警告)?

我从?tryCatch文档中得到的理解是条件处理FIFO,在这种情况下,我的直接问题的答案是否 - 至少不是直接的.在这种情况下,是否可以处理警告,然后在仍然捕获错误的同时继续执行该功能?

解决方案不适用于我:

  • suppressWarnings #我还想抓住并处理警告
  • options(warn=2) #某些警告是无害的
     relevant from `?tryCatch`
Run Code Online (Sandbox Code Playgroud)

如果在评估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)

exception-handling r try-catch

10
推荐指数
2
解决办法
2412
查看次数

嵌套浏览器调用 - 仅退出单个上下文

更新:

我个人认为这个问题是重复的,因为这个问题似乎与@ 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)

debugging r

10
推荐指数
1
解决办法
144
查看次数

基准测试:使用`表达式``quote`或两者都没有

通常,当我运行基准测试时,我将我的语句包装起来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)

benchmarking expression r

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

R中的颜色序列

有没有办法在R中创建颜色序列?

例如,类似于:

 seq("#000000", "#999999", length=20)
Run Code Online (Sandbox Code Playgroud)

r color-picker colors color-palette

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

ggplot2 - 使用两种不同的色标来叠加图

我试图覆盖两个不同的情节.一个是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)

datdat2具有相同的架构,但具有不同的值.

我找到了几个解决叠加图的例子,但似乎都没有解决这个特定的问题.

color-scheme r ggplot2

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

警告消息行号R.

我有一个很大的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

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

R中的嵌套foreach循环更新公共数组

我试图在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 <-它放到其他地方,但它似乎不喜欢它.我认为这将是一个非常容易解决的问题,但我所有的搜索还没有把我带到那里.谢谢.

parallel-processing foreach r

9
推荐指数
2
解决办法
8021
查看次数

何时在'strsplit'中设置'perl = TRUE'不起作用(按预期或根本不起作用)?

我只是做了一些基准测试,而试图优化一些代码,并指出,strsplitperl=TRUE比跑步strsplitperl=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(省略fixeduseBytes参数)?换句话说,我们不能用perl=TRUE它做什么可以通过设置来完成perl=FALSE

regex pcre r

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

不规则时间序列的条件滚动均值(移动平均值)

我有一组格式的数据:

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 time-series moving-average

9
推荐指数
2
解决办法
5592
查看次数