通过 (...) 时避免参数重复

2024-02-26

考虑功能

f <- function(x, X) mean(c(x,X))

我怎样才能自动(通过操纵f()) 更改签名f()这样它就可以与lapply(),即不返回以下明显的错误?

lapply(X=list(1), FUN=f, X=1)
Error in lapply(X = list(1), FUN = f, X = 1) : 
  formal argument "X" matched by multiple actual arguments

到目前为止我使用的方法是删除所有参数f(),将它们分配到一个环境中,并评估f()在那个环境中。

integrateArgs <- function (f, args) 
{
    form <- formals(f)
    if (!is.null(form)) 
        for (i in seq_along(form)) assign(names(form)[i], form[[i]])
    if (!is.null(args)) 
        for (i in seq_along(args)) assign(names(args)[i], args[[i]])
    ff <- function() {
    }
    parent.env(environment(ff)) <- parent.env(environment(f))
    body(ff) <- body(f)
    if (any(names(form) == "...")) 
        formals(ff) <- form[names(form) == "..."]
    ff
}
fnew <- integrateArgs(f, list(x=1, X=4))
lapply(list(fnew), function(x) x())
[[1]]
[1] 2.5

但是,如果以下情况,该方法会导致以下错误f()是另一个 R 包中调用编译代码的函数。

fnew2 <- integrateArgs(dnorm, list(x=1, mean=4))
lapply(list(fnew2), function(x) x())
Error in x() (from #1) : object 'C_dnorm' not found

有更好的解决方案吗?


正如 MrFlick 的评论中所建议的,一种解决方案是

library(purrr)
integrateArgs <- function(f, args){
    do.call(partial, c(list(f), args))
}
fnew2 <- integrateArgs(dnorm, list(x=1, mean=4))
lapply(list(fnew2), function(x) x())
[[1]]
[1] 0.004431848

下面类似的方法不需要包purrr:

integrateArgs <- function(f, args){
    do.call(function(f, ...) {
        eval(call("function", NULL,
                  substitute(f(...))), envir = environment(f))}, 
        c(f = list(f), args))
}
fnew2 <- integrateArgs(dnorm, list(x=1, mean=4))
lapply(list(fnew2), function(x) x())
[[1]]
[1] 0.004431848

现在使用类似的方法优化并行版本 0.7-4 使用并行执行函数parallel::parLapply(): https://cran.r-project.org/package=optimParallel https://cran.r-project.org/package=optimParallel

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 (...) 时避免参数重复 的相关文章

随机推荐

  • Node.js for循环中的mysql查询

    我有两个疑问 首先 SELECT auctions name wowitemdata itemName auctions itemId auctions buyout auctions quantity FROM auctions INNE
  • 如何在 Vim 中替换一个文件夹中的所有文件?

    我知道通过输入以下内容 s iwanthis replacedbythis g 将更改文件的所有匹配单词 如何对文件夹中的所有文件执行相同的操作 实际上替换了很多这样的单词 padding bottom 5px 打开 Vim 将所有文件加载
  • 无状态协议是否比有状态协议更适合使用?

    我可以看到 有状态的协议可以减少像 cookie 这样的 模拟状态 但是测试变得更加困难 以确保您的实现正确并重新连接 并且会话继续可能很难处理 始终使用无状态协议是否被认为是更好的做法 或者它确实是特定于领域的 我认为在处理有状态协议时身
  • 从 webview 的 Javascript 界面更新 UI 会使应用程序崩溃

    我正在开发混合网络视图 本机应用程序 并且遇到了应用程序崩溃的问题 以下是简要概述 应用程序位于单个 FrameLayout 中 顶部有一个 LinearLayout 我在左侧和右侧放置一个按钮 在中间和下面放置我的应用程序徽标 我有我的
  • MySQL插入语句队列

    我们正在构建一个 ajax 应用程序 其中用户输入被提交到 php 脚本进行处理 我们目前正在将每个请求写入日志文件以进行跟踪 我想将此跟踪移至数据库表中 但我不想在请求后运行插入语句 我想做的是建立一个需要在 MySQL 数据库上处理的事
  • 将 SweetAlert2 与 TypeScript 结合使用,找不到模块“sweetalert2/dist/sweetalert2.js”的声明文件

    我正在将我的一个项目迁移到 TypeScript 在该项目中甜蜜警报2 https sweetalert2 github io 使用库 导入 SweetAlert2 JS 和 CSS 的默认方式是 import Swal from swee
  • 数据库表和面向对象的类之间有关系吗?

    每次我编程时 我都会认识到类和表之间的这种关系 或者是我的想象 您可以为每个数据库表一个类或每个类一个表 即 tables customer products order classes customer products order ma
  • 如何将自定义参数传递给 Locust 测试类?

    我目前正在使用环境变量将自定义参数传递给我的负载测试 例如 我的测试类如下所示 from locust import HttpLocust TaskSet task import os class UserBehavior TaskSet
  • SwiftUI iOS14 GeometryReader 无效的框架尺寸

    我的 GeometryReader 在 iOS13 中工作正常 但现在在 iOS14 中出现线程问题 框架尺寸无效 负或非有限 我打印了读者应该返回的尺寸 看起来不错 该应用程序仍然基本上可以工作 但看起来有点奇怪 因为引入了一些填充 有谁
  • Node.js:如何为 prod 和 staging 设置不同的变量

    我正在使用 Express 并且需要为每个服务器 登台和生产 使用不同的凭据 我可以在 server coffee 文件中设置变量 但随后我需要访问不同文件中的这些变量 server coffee app configure product
  • 我可以在 EJS 中渲染多个源吗

    我尝试使用来自 2 个不同源的数据 但使用 EJS JS 和 Node 将它们呈现在同一个 HTML 页面上 这就是我正在尝试的 app set view engine ejs app get function req res res re
  • 无法建立新连接

    import requests url http ES search demo com document record search pretty true data query bool must text record document
  • 谷歌地图缩放看起来很奇怪

    我遇到了 Google 地图问题 除了缩放按钮似乎混乱之外 一切似乎都正常 Here is an image of the map 我猜有些东西是重叠的 但我不太确定 看来我来晚了 还是想分享一下我的想法 编辑库的核心 CSS 并不是一个好
  • 如何使用 GLFW 轮询 libdispatch 块中的事件?

    跟进答案如何将 GLUT 与 libdispatch 一起使用 https stackoverflow com q 12553563 64860 我现在改用 GLFW 以下代码设置一个窗口 设置一个计时器来轮询事件 并随着时间的推移将渲染更
  • 将值添加到空 Swift 数组

    我不知道如何在 Swift 中向空数组添加值 我尝试以两种不同的方式从空数组开始 var emptyArray Int emptyArray Int and var emptyArray 顺便问一下 这两种创建空数组的方式有什么区别 我尝试
  • 如何使用appledoc生成类似Apple的文档

    我正在阅读如何生成类似 Apple 的 HTML 文档的文章 here http gentlebytes com appledoc docs examples basic 我的问题是命令行的用途 我们如何将命令行和 appledoc xco
  • Outlook JS Addin - 撰写表单 - 如何检查事件/消息是否已保存?

    Outlook 加载项 office js 的撰写表单中是否有一种方法可以检查表单后面的对象 在我的例子中是日历事件 是否已保存 检查物品ID 如果未定义 则消息未存储 如果存在 则消息来自草稿 请参阅Office context mail
  • Process.GetProcesses 返回所有登录用户的进程?

    在允许多个用户同时登录一台机器的windows环境中 当我们调用Process GetProcesses 它是否返回进行此调用的登录用户的进程 还是返回所有登录用户的进程 我查看了 MSDN 页面 但找不到此信息 该函数返回本地计算机上运行
  • socket.error[Errno 99] 无法分配请求的地址

    昨天 我创建了一个名为的 python 脚本sniffer ip header decode py 但我遇到了以下错误 Traceback most recent call last File sniffer ip header decod
  • 通过 (...) 时避免参数重复

    考虑功能 f lt function x X mean c x X 我怎样才能自动 通过操纵f 更改签名f 这样它就可以与lapply 即不返回以下明显的错误 lapply X list 1 FUN f X 1 Error in lappl