繁体   English   中英

R:on.exit-使用返回值而不知道其名称

[英]R: on.exit - use returned value without knowing its name

我有下面的功能。 除了函数中的第一段代码,我无法以任何方式更改该函数。
在这个简单的示例中,我想显示在返回对象上应用一些功能。
关键是函数返回的变量的名称可能会有所不同,我无法猜测。
显然,我也无法将f函数包装到{ x <- f(); myfun(x); x } { x <- f(); myfun(x); x } { x <- f(); myfun(x); x }
我的on.exit调用中的以下.Last.value表示f函数要返回的值。

f <- function(param){
  # the only code I know - start
  on.exit(if("character" %in% class(.Last.value)) message(print(.Last.value)) else message(class(.Last.value)))
  # the only code I know - end

  # real processing of f()

  a <- "aaa"
  "somethiiiing"
  if(param==1L) return(a)

  b <- 5L
  "somethiiiing"
  if(param==2L) return(b)

  "somethiiiing"
  return(32)
}
f(1L)
# function
# [1] "aaa"
f(2L)
# aaa
# [1] 5
f(3L)
# integer
# [1] 32

上面带有.Last.value代码似乎正在处理滞后 (因此实际上不起作用),而且.Last.value可能不是走的路,因为我想像if(fun0(x)) fun1(x) else fun2(x) ,并且由于返回的值可能是一个大对象,因此在侧面复制它也是一种不好的方法。
有什么方法可以使用on.exit或任何其他可以帮助我在不知道结果变量名称的情况下在f函数结果上运行函数的函数吗?

与修改函数的方式类似,您也可以轻松地包装它。 这是一个可复制的示例。

library(data.table)

append.log<-function(x) {
    cat(paste("value:",x,"\n"))
}

idx.dt <- data.table:::`[.data.table`
environment(idx.dt)<-asNamespace("data.table")

idx.wrap <- function(...) {
    x<-do.call(idx.dt, as.list(substitute(...())), envir=parent.frame())
      append.log(if(is(x, "data.table")) {
          nrow(x)
      } else { NA })
      x
}
environment(idx.wrap)<-asNamespace("data.table")

(unlockBinding)("[.data.table",asNamespace("data.table"))
assign("[.data.table",idx.wrap,envir=asNamespace("data.table"),inherits=FALSE)


dt<-data.table(a=1:10, b=seq(2, 20, by=2), c=letters[1:10])

dt[a%%2==0]

从R 3.2.0开始,由于有了新功能returnValue ,因此完全有可能。 下面的工作示例。

f <- function(x, err = FALSE){
  pt <- proc.time()[[3L]]
  on.exit(message(paste("proc.time:",round(proc.time()[[3L]]-pt,4),"\nnrow:",as.integer(nrow(returnValue()))[1L])))
  Sys.sleep(0.001)
  if(err) stop("some error")
  return(x)
}
dt <- data.frame(a = 1:5, b = letters[1:5])
f(dt)
f(dt, err=T)
f(dt)
f(dt[dt$a %in% 2:3 & dt$b %in% c("c","d"),])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM