如何将参数(名称)传递给函数工厂?

2023-12-19

我需要构建许多带有许多不同参数的函数,尽管它们共享许多代码和结构。 为了避免重复,我想我应该聪明地为自己构建一个函数工厂(又名闭包)。

我不知道如何在函数工厂内传递函数参数.

我的用例是一堆 S3 构造函数,所有这些函数都共享相同的验证机制。 所以我将以此为例来解释我的问题。

说吧,我有一个ClassA and ClassB,每个都需要在各自的构造函数中拥有自己的参数:

ClassA <- function(A_arg1, A_arg2) {
  # some class-SPECIFIC construction magic happens, say
  out <- list(A_arg1, A_arg2)

  # some GENERAL construction magic happens
  class(out) <- "ClassA"

  return(out)
}

ClassB <- function(B_arg1, B_arg2) {
  # some class-SPECIFIC construction magic happens, say
  out <- B_arg1 + B_arg2

  # some GENERAL construction magic happens
  class(out) <- "ClassB"

  return(out)
}

显然,我很想避免重复general构造函数的一部分,因此函数工厂可以像这样使用会好的:

ClassA <- produce_class_constructor(classname = "ClassA", fun = function(A_arg1, A_arg2) {return(list(A_arg1, A_arg2))})

理想情况下,这应该产生与上面手动构造的完全相同的函数ClassA函数,一般部分被排除。

这是我构建该函数工厂的尝试:

produce_class_constructor <- function(classname, fun) {
  class_specific_arguments <- formals(fun = fun)  # this works just fine on the console
  construct_class <- function(class_specific_arguments) {
    # here runs the class-specific stuff
    out <- fun(class_specific_arguments)

    # here runs the general stuff
    class(out) <- classname
  }
}

然而,这不起作用,因为生成的构造函数只有一个class_specific_arguments-论据,而不是实际的A_arg1, and A_arg2.

有办法做到这一点吗? 我这样做错了吗?

(对我来说非常重要的是生成的类构造函数具有正确命名的参数,因此...方法行不通)。


这是我的尝试:

produce_class_constructor <- function(classname, fun) {
  out_fun <- function() {
    out_obj <- do.call(fun, as.list(environment()))
    class(out_obj) <- classname
    out_obj
  }
  formals(out_fun) <- formals(fun)
  out_fun
}

ClassA <- produce_class_constructor(classname = "ClassA", 
  fun = function(A_arg1, A_arg2) {list(A_arg1, A_arg2)})
ClassA(1, 2)
#[[1]]
#[1] 1
#
#[[2]]
#[1] 2
#
#attr(,"class")
#[1] "ClassA"

ClassB <- produce_class_constructor(classname = "ClassB", 
  fun = function(B_arg1, B_arg2) {B_arg1 + B_arg2})
ClassB(B_arg2 = 2, 1)
#[1] 3
#attr(,"class")
#[1] "ClassB"

想法与as.list(environment())取自这个问题 https://stackoverflow.com/questions/11885207/get-all-parameters-as-list。请注意,沿着这条路你应该格外小心,因为?formals说:“这是 高级、危险的编码”。

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

如何将参数(名称)传递给函数工厂? 的相关文章

  • 如何绘制每条线之间具有特定距离的图形

    实际上 我尝试绘制一个图形 但它将所有列 线 放在一起并显示 因此它不具有代表性 我尝试制作模拟数据并向您展示我如何绘制它 并向您展示我想要的内容 我不知道如何制作像下面所示的示例的数据 但我在这里做了什么 set seed 1 M lt
  • R 编程常用工具

    如果已经以不同的方式问过这个问题 我深表歉意 但我找不到任何达到我想要的东西 我真的是从其他软件包 SPSS 开始接触 R 的 当我了解真正可以做什么时 我意识到我还需要其他 工具 这让我想到了我的问题 您有哪些用于开发 R 代码的设置 我
  • 排序因素与水平

    有人能解释一下 R 中 ordered 参数的用途吗 R says ordered逻辑标志来确定级别是否应被视为有序 按给定的顺序 所以如果我有一个名为名称的因素并设置ordered TRUE names lt factor c fred
  • R - 与 SpatialPolygonsDataFrame 对象相交的 SpatialLinesDataFrame 列表的嵌套循环

    我有一系列需要完成的步骤SpatialLinesDataFrame 此处的 线 基于对象与多特征中各个特征的关系SpatialPolygonsDataFrame 多边形 对象 简而言之 每个线列表元素源自单个面要素内部 并且可能会也可能不会
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with
  • 无法部署 ShinyApp:readTableHeader 在“raw”上发现不完整的最后一行(使用默认值:en_US)

    我已经拼命尝试部署我的闪亮应用程序大约一周了 但不幸的是我无法停止收到以下消息 Warning message Error detecting locale Error in read table file file header head
  • 从 df 中提取具有两列的重叠行对

    我想找出这两个表之间哪些对重叠 gt dput data1 structure list Name x c MDH1 MDH1 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 SCOALB SCOALB CSY4 CS
  • R- 将某些列从 0 标准化为 1,其值等于 0

    我最近开始使用 are 我想扩展我的数据矩阵 我在这里找到了一种方法在两点之间缩放系列 https stackoverflow com questions 5468280 scale a series between two points
  • 如何使用 R 将每个文件的数据添加为附加行,从而将不同的 .csv 文件合并为一个完整的文件?

    我有几个不同的文件夹 它们都包含一个 csv 文件 所有这些 csv 文件都有一个单独的列 其中包含实验的一种条件的数据 我想以将每个文件的数据添加为新列的方式合并这些 csv 文件 目前 它看起来像这样 C1 csv 102 106 15
  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • 从 n,k 维矩阵数组中减去 n,k 维矩阵

    如果我有一个数组A A lt array 0 c 4 3 5 for i in 1 5 set seed i A i lt matrix rnorm 12 4 3 如果我有矩阵 B set seed 6 B lt matrix rnorm
  • 如何在 Caret 中绘制随机森林(护林员)树

    我生成了如下所示的随机森林树 并尝试绘制它 但出现错误 我在哪里犯了错误 我怎样才能以正确的方式绘制它 Actmodel lt train Activity Section Author data CB1 method ranger trC
  • R中的字典数据结构

    在 R 中 我有 例如 gt foo lt list a 1 b 2 c 3 如果我输入foo I get a 1 1 b 1 2 c 1 3 我怎样才能看透foo仅获取 键 列表 在这种情况下 a b c R 列表可以具有命名元素 因此可
  • 为什么数据帧上的 is.vector 不返回 TRUE?

    tl dr R 中的向量到底是什么 长版 R 中很多东西都是向量 例如 数字是长度为 1 的数值向量 is vector 1 1 TRUE 列表也是一个向量 is vector list 1 1 TRUE 好的 所以列表是一个向量 显然 数
  • 将 ftransform 与折叠 R 包中的 fgroup_by 一起使用

    我正在尝试重现以下输出dplyr代码与R包裹collapse dplyr Code library tidyverse starwars gt select name mass species gt group by species gt
  • R 中两个时间戳之间的左连接

    我的目标是执行左连接intervals哪里的bike id比赛和created at时间戳在records在 之间start and end in the intervals table gt class records 1 data ta
  • 正态分布平均值的贝叶斯推理玩具 R 代码 [降雪量数据]

    我有一些降雪观测 x lt c 98 044 107 696 146 050 102 870 131 318 170 434 84 836 154 686 162 814 101 854 103 378 16 256 我被告知它遵循正态分布
  • 警告消息 - 来自 dummies 包的 dummy

    我正在使用 dummies 包为分类变量生成虚拟变量 其中一些变量具有两个以上类别 testdf lt data frame A as factor c 1 2 2 3 3 1 B c A B A B C C C c D D E D D E
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • 绘制 Cox 回归的 Kaplan-Meier 图

    我使用 R 中的以下代码设置了一个 Cox 比例风险模型来预测死亡率 添加协变量 A B 和 C 只是为了避免混淆 即年龄 性别 种族 但我们真正对预测变量 X 感兴趣 X 是一个连续变量 cox model lt coxph Surv t

随机推荐

  • 如何让 Go HTTP 客户端不自动遵循重定向?

    我目前正在用 Go 编写一些与 REST API 交互的软件 我尝试查询的 REST API 端点返回 HTTP 302 重定向以及指向资源 URI 的 HTTP Location 标头 我正在尝试使用 Go 脚本来获取 HTTP Loca
  • 从 Android 选项菜单启动 Activity

    我浏览了这些论坛以找到该问题的解决方案 尽管似乎有解决方案 但似乎没有一个对我有用 所以就这样吧 我是 Android 开发的新手 我有一个带有选项菜单的应用程序 当我单击选项中的一个时 我希望它启动一项新活动 但我不断收到错误 Inten
  • Strassen 算法中的递归

    我想知道如何在斯特拉森的算法中进行递归调用 以及它们到底需要在哪里 我知道 7 个乘数比 8 个乘数更有效 但我对如何递归计算这些乘数感到困惑 特别是 如果我们遵循分而治之的范式 那么我们究竟要 划分 矩阵的哪一部分 以及我们如何才能做到这
  • 类型的调用者没有这样的方法

    我创建了一个类 其中包含multi函数重载的定义 但是当我尝试调用该类和重载方法时 它会抛出错误 可以运行以产生此错误的工作示例如下所示 class Test multi test data return test data data el
  • Python 的 Fasttext - 模块“fasttext”没有属性“load_model”

    请原谅我的新手 但 fasttext 在 python 上不适合我 我正在使用运行 python 3 6 的 anaconda 我的代码如下 只是一个例子 import fasttext model fasttext load model
  • Java 1.6 Windows-1252 编码因 3 个字符而失败

    编辑 我确信这个问题有点荒谬 感谢那些回复的人 我可能会发布一个更具体的后续问题 今天 我正在解决一些编码问题 并编写了这个单元测试来隔离基本重现案例 int badCount 0 for int i 1 i lt 255 i String
  • MySQLWorkbench正向工程错误

    我正在 MySql Workbench 8 0 中处理模型 当我单击正向工程并尝试生成我的模型的脚本时 我得到 Executing SQL script in server ERROR Error 1064 You have an erro
  • 根据列名称列表对列进行子集化,并将该列放在其前面

    我有一个更大的数据集 遵循相同的顺序 一个唯一的日期列 数据 唯一的日期列 日期等 我不仅尝试按名称对数据列进行子集化 还尝试对唯一的日期列进行子集化 下面的代码根据名称列表选择列 这是我想要的一部分 但是关于如何在子集列之前获取该列有什么
  • 存储使用 Atlassian SourceTree 所做的更改

    我的项目中更改了很多文件 我想隐藏 2 个文件 但我有点害怕犯错误 因为我从未这样做过 If i would stash now will it only stash the 2 staged files 如果我不标记 保留分阶段更改 它会
  • 如何在 MongoDB 上按字符串长度对结果进行排序

    我可以在mysql上轻松完成 select from TABLE order by length FIELD asc 我怎样才能在 MongoDB 上做到这一点 MongoDB 3 4 引入了 strLenCP https docs mon
  • 配置“--prefix”选项进行交叉编译

    我应该通过哪条路径 prefix进行交叉编译时的选项 我应该指定构建机器上的路径还是目标平台上的路径 假设我将代码构建到 home me arm build target fs usr 之后我将文件复制到我的目标平台 它们将位于 usr 我
  • 通过 AJAX 的跨源资源共享 (CORS)

    我知道关于这个主题有很多问题 一段时间以来我一直在努力解决这个问题 请让我了解一下这个具体案例 My Goal 我正在尝试从以下 URL 获取 JSON 数据 https www icims com bellworks https www
  • 纯 JavaScript 中的 jQuery live() ?

    我正在尝试用纯 JavaScript 实现 jQuery live 函数的功能 这里有人可以帮忙吗 Thanks 这是一个启动的小例子 document onclick function evt evt evt window event v
  • JS 代理模式

    我使用此代码来覆盖 window alert 函数 该函数用 r n 替换中断 它在 Firefox 中运行良好 但在 IE 中当然不行 我收到错误 不支持属性或方法 function var proxied window alert wi
  • CMake检查主项目是否被调用

    我有这样的项目目录设计 Main CMakeLists txt subproject1 CMakeLists txt subproject2 CMakeLists txt 如果 subproject1 cmake 被主项目调用 或者作为独立
  • 根据字段值增量并创建记录

    访问2003 最终 我需要创建一个用于打印标签 样品 ID 罐 x of x 的报告 我的桌子上有样品 ID 和罐子数量 是否可以创建一个查询 为我提供 3 个字段 样品 ID 罐号 罐数 其中罐号根据罐数以增量方式创建记录 Query S
  • Java - 编译错误方法无法调用

    我必须使用测试工具编译我的代码 但是 当该测试工具调用我的方法时 我收到此错误 Course 类中的 getCourseDetails 方法不能应用于给定类型 必需 java lang String int java lang String
  • Typescript 将元组的类型元组转换为元组(展平元组)

    我有这个 Type T Params lt Tuple1 Tuple2 gt eg string number 制作方法 压扁 Type Flatten
  • 如何锁定 cytoscape.js 节点在其父节点内的位置

    我想锁定节点相对于其父复合节点的位置 这样 如果我抓取并拖动父节点 子节点会随之移动 但子节点不能单独抓取 如果我将子项设置为不可抓取和 或锁定 那么它不会与其父项一起移动 但如果我不这样做 它可以被单独拖动 这是我不想要的 这可以做到吗
  • 如何将参数(名称)传递给函数工厂?

    我需要构建许多带有许多不同参数的函数 尽管它们共享许多代码和结构 为了避免重复 我想我应该聪明地为自己构建一个函数工厂 又名闭包 我不知道如何在函数工厂内传递函数参数 我的用例是一堆 S3 构造函数 所有这些函数都共享相同的验证机制 所以我