【问题标题】:How to access function arguments (if function is passed as string) in R如何在 R 中访问函数参数(如果函数作为字符串传递)
【发布时间】:2017-10-13 12:48:12
【问题描述】:
warn <- NULL
withwarn <- function(fun) { tryCatch(fun, warning=function(w) { 
  warn <<- append(warn, paste(time, conditionMessage(w))) } )}

withwarn(reqHistoricalData(tws,x,time,'1 min','5 D','0','HISTORICAL_VOLATILITY'))

我将一个函数传递给 tryCatch 并希望获得参数 time 的值 我用 sys.call 等尝试了几种建议的方法,但似乎我的问题有所不同:对于函数(w),time 没有传递,并且在函数(fun)中时间只是函数字符串的一部分(仅评估稍后在 tryCatch 中)

编辑(解决方法):

我刚刚为time 添加了另一个参数withwarn &lt;- function(fun,y)。

【问题讨论】:

  • 关于术语的一句话:“函数”≠“函数调用”。您将 函数调用 传递给 withWarn,而不是函数。因此,更好的参数名称是 expr(比较 local 和 evalq 的参数名称)。
  • 谢谢!这些正是我仍然需要学习的术语/命令(eval、expr、quote、call、...) :-)

标签: r function try-catch parameter-passing


【解决方案1】:

这个怎么样:

warn <- NULL
withwarn <- function(fun) { 
    args <- match.call()
    time_arg <- if("time" %in% names(args[[2]])) 
        eval(args[[2]][["time"]])
    else {
        eval(args[[2]][[4]])
    } 
    tryCatch(fun, warning=function(w) { warn <<- append(warn, paste(time_arg, conditionMessage(w))) } )
}

reqHistoricalData <- function(tws, x, time, ...) warning("some warning.")

ans <- withwarn(reqHistoricalData(tws, x, Sys.time(), '1 min','5 D','0','HISTORICAL_VOLATILITY'))

但是,您在问题中的解决方法对我来说看起来更好/更干净。

【讨论】:

  • 谢谢!不幸的是,“时间”是在另一个函数中定义的(并且不能更改)。但我找到了一个简单的解决方法(并更新了问题)
  • 编辑扩展代码仅供参考。实际上,我更喜欢你的解决方法。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2015-11-13
  • 1970-01-01
相关资源
最近更新 更多