r - 嵌套 lapply 以允许调用具有多个输入的函数
问题描述
编辑:我有一些带有多个参数的函数,我想将其应用于列表列表。其中一个参数也是列表列表。这两个函数都有多个参数。其中两个我必须在列表列表中递归地指出。假设我有以下两个列表。
mylist <- list(list(10,12,13,14,15), list(5,6,7,8,9))
m <- list(list(2,2,2,3,4), list(3,3,4,4,5))
和功能
func1 <- function(x, att1 = m, const = 10){
e <- x^m + const
return(e)
}
func2 <- function(x, att2 = m, const = 10){
d <- sqrt(x)/m + const
return(d)
}
我不知道如何处理正确的参数,att1
或者att2
,当我想调用每个函数时。我尝试使用以下功能eval(substitute(att1 = a))
nested_function <- function(df_list, FUN = func1, changing_param = a, ...){
nested_output <- lapply(seq(df_list), function(i){
lapply(seq(df_list[[i]]), function(j){
FUN(df[[i]][[j]], eval(substitute(changing_param))[[i]][[j]],...)
})
})
return(nested_output)
}
result <- nested_function(df_list, FUN = func1, changing_param = 'att1 = a')
并得到以下错误:
Error in df[[i]] : object of type 'closure' is not subsettable
6.
FUN(df[[i]][[j]], eval(substitute(changing_param))[[i]][[j]],
...)
5.
FUN(X[[i]], ...)
4.
lapply(seq(df_list[[i]]), function(j) {
FUN(df[[i]][[j]], eval(substitute(changing_param))[[i]][[j]],
...)
})
3.
FUN(X[[i]], ...)
2.
lapply(seq(df_list), function(i) {
lapply(seq(df_list[[i]]), function(j) {
FUN(df[[i]][[j]], eval(substitute(changing_param))[[i]][[j]],
...) ...
1.
nested_function(mylist, changing_param = m)
我的问题是如何使FUN()
调用识别a
为att1
infunc1
和att2
in func2
,因为我必须为每个函数指定它们(我不能只将参数放在那里)。
有什么建议么?
解决方案
如果您需要动态构建参数名称,您通常必须最终使用do.call
(至少使用基本 R)。我很确定你的所有变量在你的例子中应该如何工作,所以这是一个运行的改编版本。
df_list <- list(list(10,12,13,14,15), list(5,6,7,8,9))
param_list <- list(list(2,2,2,3,4), list(3,3,4,4,5))
func1 <- function(x, att1 = m, const = 10){
e <- x^att1 + const
return(e)
}
func2 <- function(x, att2 = m, const = 10){
d <- sqrt(x)/att2 + const
return(d)
}
nested_function <- function(df_list, param_list, FUN = func1, changing_param = "a", ...){
nested_output <- lapply(seq(df_list), function(i){
lapply(seq(df_list[[i]]), function(j){
params <- list(df_list[[i]][[j]], param_list[[i]][[j]], ...)
names(params)[2] <- changing_param
do.call(FUN, params)
})
})
return(nested_output)
}
nested_function(df_list, param_list, func1, changing_param = 'att1', const=1)
nested_function(df_list, param_list, func2, changing_param = 'att2', const=2)
在这里,我们将所需参数的名称作为字符串传入。然后,当我们构建要传递给函数的参数时,我们用提供的名称重命名传入的参数,然后调用函数。
推荐阅读
- c++ - 如何在不阻塞 C++ 中的主线程的情况下无限运行线程?
- java - Selenium - 使用 Java 的 Safari facebook 登录错误
- android - Kotlin:来自 AppCompatActivity 的片段
- javascript - 更新时反应状态材料ui地图冲突
- wordpress - 将图像标题和/或描述添加到标题
- debugging - GDB - 获取当前线程的调用堆栈上的总帧数
- node.js - 授权用户如何仅提出获取请求
- reactjs - React - 移除事件监听器(onmousedown -> onmousemove)
- django - Django 表单不为自定义用户模型保存
- javascript - Jquery滑块下一个按钮不呈现下一个图像