gpt4 book ai didi

R装饰器改变输入和输出

转载 作者:行者123 更新时间:2023-12-04 23:50:35 28 4
gpt4 key购买 nike

我正在尝试重构这个。在 Python 中,我会使用装饰器。 'R'tful 的方法是什么?说,我们有这个模式

good_input <- format_input( bad_input )
bad_output <- use_this_func( good_input )
good_output <- format_output( bad_output )

然后再一次,
good_input <- format_input( bad_input )
bad_output <- use_this_other_func( good_input )
good_output <- format_output( bad_output )

可以想象,它像野生蘑菇一样繁殖。我想要接近这个解决方案的东西
use_this_robust_func <- wrapper( use_this_func ) # Or wrapper( use_this_other_func )
good_output <- use_this_robust_func( bad_input )

我正在尝试结束对 use_this_func 的调用和 use_this_other_func (和相关功能)与 format_inputformat_output .部分使用此 question ,到目前为止我有
wrapper <- function( func_not_robust ){
func_robust <- function( ... ){
# This is the bit I haven't figured out
... format_input( ) ... # supposed to convert bad input - the function argument - to good
bad_output <- func_not_robust( ... ) # supposed to take good input as argument
good_output <- format_output( bad_output )
return( good_output )
}
return( func_robust )
}

对不起,伪代码。请注意,我不确定这是否是 R 中要走的路。我不喜欢上面解决方案的草图,它源于将 Python 翻译 - 并且很糟糕 - 到 R。R 本地人如何做到这一点?提前致谢。

最佳答案

我认为你几乎在那里。这是一个示例,其中清理的第一阶段是用 NA 替换负输入值,输出清理很简单,可以否定所有内容:

format_input <- function(x){
x[x<0] <- NA
return(x)
}

format_output <- function(x){
return(-x)
}

wrapper <- function(f){
force(f)
g = function(bad_input){
good_input = format_input(bad_input)
bad_output = f(good_input)
good_output = format_output(bad_output)
return(good_output)
}
g
}

然后:
> wrapper(sqrt)(c(-2,2))
[1] NA -1.414214
wrapper(sqrt)返回一个“闭包”,这是一个带有封闭数据的函数。函数 f具有函数值 sqrt作为该 shell 的一部分。
forcef 起需要调用当 g 时不会被评估被创建,在某些情况下没有它然后 f由于 R 的懒惰评估或“ promise ”或其他原因,在运行包装版本时不会被找到。我从不完全确定何时发生这种情况,但添加了 force调用闭包生成器的未评估参数是零开销的。它有点 cargo 崇拜编程,但从来没有问题。

一个更灵活的解决方案可能是将输入和输出清理函数指定为闭包生成器的函数,使用默认值:
wrapper <- function(f, fi=format_input, fo=format_output){
force(f) ; force(fi); force(fo)
g = function(bad_input){
good_input = fi(bad_input)
bad_output = f(good_input)
good_output = fo(bad_output)
return(good_output)
}
g
}

然后我可以包装 sqrt具有不同的输入和输出格式化程序。例如,用正函数改变负函数:
> make_pos = function(x){abs(x)}
> wrapper(sqrt,fo=make_pos)(c(-2,2))
[1] NA 1.414214

更灵活的解决方案是发现您正在此处生成函数链。您的输出是 format_output(sqrt(format_output(bad_input))) .这是函数组合, functional 中有一个函数包来做到这一点:
> require(functional)
> w = Compose(format_input, sqrt, format_output)
> w(c(-2,2))
[1] NA -1.414214

当您的组合中有三个以上的函数时,这可能会更有用,例如,您可以拥有一个函数列表并使用 do.call 将它们组合在一起。 ....

一旦你看到函数式编程中的模式,它就会让人上瘾。我现在就停下来。

关于R装饰器改变输入和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23124096/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com