我正在寻找关于将函数列表作为参数传递代码的最佳方法的建议.
我想做的事:
我想作为一个参数传递一个函数来将它们应用于特定的输入.并根据这些提供输出名称.
一个"可重复的"例子
input = 1:5
Run Code Online (Sandbox Code Playgroud)
传递的功能是mean,min
预期电话:
foo(input, something_i_ask_help_for)
Run Code Online (Sandbox Code Playgroud)
预期产量:
list(mean = 3, min = 1)
Run Code Online (Sandbox Code Playgroud)
如果不是很清楚,请参阅我的两个解决方案以进行说明.
解决方案1:将函数作为参数传递
foo <- function(input, funs){
# Initialize output
output = list()
# Compute output
for (fun_name in names(funs)){
# For each function I calculate it and store it in output
output[fun_name] = funs[[fun_name]](input)
}
return(output)
}
foo(1:5, list(mean=mean, min=min))
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种方法是我们不能通过这样做来调用它:foo(1:5, list(mean, min)).
解决方案2:将函数名称作为参数传递并使用get
foo2 <- function(input, funs){
# Initialize output
output = list()
# …Run Code Online (Sandbox Code Playgroud) 我希望实现的目标
所以我想在函数列表中获取我的函数名称.
这是一个例子:
foo = list(foo1 = sum, foo2 = mean)
Run Code Online (Sandbox Code Playgroud)
我想从中提取的foo是:
list("sum", "mean")
Run Code Online (Sandbox Code Playgroud)
我希望它是一个功能,意思是:
> foo = list(foo1 = sum, foo2 = mean)
> super_function(foo)
list("sum", "mean")
Run Code Online (Sandbox Code Playgroud)
我检查了什么
应用名称:
> sapply(foo , names)
$`foo1`
NULL
$foo2
NULL
Run Code Online (Sandbox Code Playgroud)
应用deparse(substitute())
> my_f <- function(x)deparse(substitute(x))
> sapply(foo, my_f)
foo1 foo2
"X[[i]]" "X[[i]]"
Run Code Online (Sandbox Code Playgroud)
这两个想法都没有用......
更多背景:
这里有一些更多的细节.一个人不需要他们理解第一个问题,但社区要求提供额外的细节.
我正在使用这些函数作为用户给出的聚合函数.
data(iris)
agg_function<-function(data, fun_to_apply){
res <- list()
for (col_to_transform in names(fun_to_apply)){
res[col_to_transform] <- (fun_to_apply[[col_to_transform]])(data[[col_to_transform]])
}
res
}
agg_function(iris, fun_to_apply = list("Sepal.Length" = mean, "Petal.Length" = …Run Code Online (Sandbox Code Playgroud) 我的背景
我正在使用 tesseract 从图像中提取文本。
我正在生成一个.tsv来检索提取的文本并对其执行一些正则表达式,并生成一个.pdf以获得可搜索的 pdf。
我的方法是调用 tesseract 两次:
但我觉得这不是很有效(相同的计算必须进行两次)
我的愿望是什么
我希望让我的计算速度更快。我的想法是只调用一次 tesseract 但指定两种输出格式
是否可以?如果是这样怎么办?
为了构建通用框架,我想构建一个s4类,其插槽可以是任何类型。可能吗?如果是这样怎么办?
我发现这个问题解决了多类型问题。但是我想让任何类型的对象都可以,而不仅仅是一些预定义的类型。
setClass("foo",
representation(
anything = "..."
)
)
# I would like to be able to perform all of these
new("foo", anything = 1)
new("foo", anything = "a")
new("foo", anything = data.frame())
...
Run Code Online (Sandbox Code Playgroud)