R 中的函数工厂

2024-01-06

我尝试通过返回专门函数的字典来提出一个函数工厂,或多或少类似于函数式编程风格。我尝试在下面的代码中执行此操作。

require(hash)

names = c("aa","bb","cc");
funs = hash()
for (i in seq(length(names))) {
  n = names[i]
  funs[[n]] = function(x) { 
    print(paste(n,":",x, sep="")) 
 }
}

显然,我的数组中有 3 个函数;然而,它们的行为都与迭代中的最后一个函数相同。

> funs[["aa"]](1)
[1] "cc:1"
> funs[["bb"]](2)
[1] "cc:2"
> funs[["cc"]](3)
[1] "cc:3"

我的猜测是 R 没有创建新的函数实例,而是在 for 循环内重用相同的函数对象。

我尝试以下操作,希望 R 能够创建不同的函数对象,

  funs[[n]] = eval(parse(text="function(x) { print(paste(n,':',x, sep='')) }"))

但它的工作原理与第一个相同。

您知道如何创建一个生成不同函数对象的生成器吗?


根据哈德利的说法高级 R 编程、词法范围 http://adv-r.had.co.nz/Functions.html#lexical-scoping,变量n在函数体内funs[['aa']], funs[['bb']], and funs[['cc']]是变量n in <environment: R_GlobalEnv>.

例如:

> funs[["aa"]](1)
[1] "cc:1"
> n <- "1234"
> funs[["aa"]]("1")
[1] "1234:1"

为了做你想做的事,我将编写一个返回函数的函数:

funs.gen <- function(n) {
  force(n)
  function(x) {
    print(paste(n, ":", x, sep=""))
  }  
}

names = c("aa","bb","cc");
funs = hash()
for (i in seq(length(names))) {
  n = names[i]
  funs[[n]] = funs.gen(n)
}

funs[["aa"]](1)
funs[["bb"]](2)
funs[["cc"]](3)

注意force用于要求R不惰性求值表达式n。如果你删除它,那么 R 将评估n出于for循环将产生与您的问题相同的结果。

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

R 中的函数工厂 的相关文章

  • 使用 != 子集 data.table 也排除 NA

    我有一个 data table 其中有一列NAs 我想删除该列具有特定值的行 恰好是 然而 我的第一次尝试导致我失去了行NA还有 gt a c 1 NA gt x lt data table a x a 1 1 2 3 NA gt y lt
  • 在 R 中根据时间序列数据制作 3D 曲面

    我有一个大型数据集 我想从中制作 3D 表面 我希望 x 轴为日期 y 轴为时间 24 小时 z 轴 高度 为我的值 我是 R 初学者 所以越简单越好 http www quantmod com examples chartSeries3d
  • spplot 的图例范围和颜色分布问题

    我的绘图和图例中的颜色范围是否正确存在问题 这是我使用的代码 data ch4 lt read csv2 v42 CH4 1970 TOT txt skip 3 stringsAsFactors FALSE header F num dat
  • r - 根据第一个向量重新排序第二个向量

    寻找解决方案来执行以下操作 有两个向量 a lt c 2 1 3 4 7 6 5 9 8 10 b lt c 3 2 1 6 5 4 7 8 9 10 我想创建第三个向量 它给出向量的顺序b需要重新排序 使其顺序与a 在这种情况下我想得到
  • dplyr:取消选择由给出的列

    如何取消选择中给出的列 自写函数的参数 我还需要在另一点选择列 因此只需使用 in 没有解决我的问题 任何解决方案表示赞赏 select 帮助者 操纵者quosures或表达方式 very simple example data test
  • 如何在 Ocaml 中表示一个简单的有限状态机?

    我用 C 和 Java 编写过一些状态机 但从未用过像 Ocaml 这样的函数式语言 问题是我不知道我是否可以从对象语言版本中调整代码 因为在 Ocaml 中记录和变体比类更强大 所以 我需要一个事件驱动的有限状态机 像 UML 中的分层结
  • 难以理解 R 中双括号和单括号子集之间的区别[重复]

    这个问题在这里已经有答案了 我很难理解双括号子集和单括号子集之间的区别 我在开源编程方面相当陌生 我很难理解 R 中的 help 函数 因为考虑到我目前对 R 的理解 其中的一些信息对我来说太技术性了 我尝试过谷歌搜索差异 虽然它给了我一个
  • 如何绘制对数似然函数图

    我想绘制 pi 和 pi 之间的对数似然函数 对数似然函数 llh lt function teta x sum log 1 cos x teta 2 pi x c 3 91 4 85 2 28 4 06 3 70 4 04 5 46 3
  • 使用 by 参数连接 data.table

    我有两个数据表dx and dy dx lt data table a c 1 1 1 1 2 2 b 3 8 dy lt data table a c 1 1 2 c 7 9 我要参与dy到每一行dx 下面是所需的输出 data tabl
  • magrittr 管道中的 WOE

    如何将下面的证据代码权重放入 magrittr 管道中 df gt 我尝试过的一切似乎都不起作用 df library Information library magrittr df a c aa bb cc aa aa aa bb cc
  • 从 glmnet 获取变量选择顺序

    我一直在使用 glmnet R 包为一个目标变量 Y 数字 和 762 个协变量构建 LASSO 回归模型 我使用 glmnet 函数 然后coef fit s 0 056360 获取该特定 lambda 值的系数值 我现在需要的是变量选择
  • knn-相同的k,不同的结果

    我有一个矩阵ZZ 我跑完之后prcomp并选择了我收到的前 5 台电脑data new P prcomp zz data new P x 1 5 然后我分成训练集和测试集 pca train data new 1 121 pca test
  • RQuantLib 包不适用于 R 3.5.0

    有没有其他人尝试加载 R 3 5 0 的 RQuantLib 包 我尝试过 以前有效 install packages drat dependencies TRUE drat addRepo ghrr install packages RQ
  • 如何为 nls 函数找到良好的起始值?

    我不明白为什么我不能对这些数据使用 nls 函数 我尝试过很多不同的起始值 但总是出现相同的错误 这是我一直在做的事情 expFct2 function x a b c a 1 exp x b c vec x lt c 77 87 87 7
  • 如何删除括号内的值的行?

    我正在使用以下数据框 Name Height Eric 64 Joe 67 Mike 66 Nick 72 Dave 69 Steve 73 我想删除 名称 列以左括号 开头的所有行 因此最终的数据框如下所示 Name Height Eri
  • 将 dplyr 中的starts_with与部分列名称的向量一起使用

    我想使用 dplyr 选择与字符串向量匹配的某些列 one lt seq 1 10 two lt rnorm 10 three lt runif 10 1 2 four lt 10 1 df lt data frame one two th
  • 删除ggplot2 geom_bar中没有数据的日期列[重复]

    这个问题在这里已经有答案了 我想隐藏 ggplot2 中没有数据的列 这是使用 nycflights13 库的可重现示例 library nycflights13 library dplyr library ggplot2 small da
  • 如何合并具有相同列名的数据框

    我有一个数据框 如下所示 structure list Variables structure list ADA ADA LEAD LEAD BIG4 BIG4 LOGMKT LOGMKT LEV LEV ROA ROA ROAL ROAL
  • 在前两个冒号上分割字符串

    我想在前两个冒号上拆分一列字符串 但不在任何后续冒号上拆分 my data lt read table text my string some data 123 34 56 78 100 87 65 43 21 200 a4 b6 c888
  • R 比较所有列对的每个值[重复]

    这个问题在这里已经有答案了 我有一个 18x18 的数据框 我想将所有可能的列对相互比较 以便对于每对两列 18 行中的值相互比较 由于我的数据太大 无法放在这里 我写了一个小例子来说明到目前为止我所想到的 gt a lt c 1 18 g

随机推荐

  • 计算并返回列表中的平均值

    我有一个很长的清单 其中包含一些值 我想定义一个函数 它获取列表并计算列表中每 24 个值的平均值 并将平均值作为列表返回 我该怎么做呢 我的列表中有 8760 个元素 返回的列表应该给出 8760 24 365 个元素 hourly te
  • Django REST Framework:如果相关字段不存在,则在 POST 上返回 404(而不是 400)?

    我正在开发一个 REST API 它从一些无法修补或其他任何东西的真正脑死亡的软件中获取 POST 请求 POST 用于更新数据库中已存在的模型对象 具体来说 我正在发布具有相关字段 SlugRelatedField 因为 POSTer 知
  • C++ 在给定用户输入整数的情况下打印空格或制表符

    我需要将用户输入 数字 转换为 TAB 空格的输出 例如我询问用户 cout lt lt Enter amount of spaces you would like integer lt lt endl cin gt gt n n 我需要将
  • 检查某个单词是否在 Python 列表中

    我是学习Python的初学者 并且已经进行了相当多的练习 但是我在编写我想编写的某些代码时遇到了困难 本质上 我想编写一个代码来分析每个列表中的单词 以检查单词 deer 是否确实在哺乳动物列表中并打印特定消息 这是我的尝试 myMamma
  • 使用 UIPinchGestureRecognizer 绘制线条

    我想使用 UIPinchGeustureRecognizer 画线 我已经尝试了所有 stackoverflow 解决方案 但没有运气 请帮我解决这个问题 我收到以下错误 首先我想知道我的代码逻辑是否正确 并且我没有从触摸开始 触摸移动中得
  • 为什么我的简单 pygame 会滞后? [复制]

    这个问题在这里已经有答案了 我一直在使用 pygame 制作一个简单的 python 游戏 在添加切换枪支的功能后 游戏开始滞后 我不知道为什么它滞后 我尝试过重新启动 但没有成功 该代码非常短 所以可能只是我的电脑 但如果有任何可以帮助运
  • UI 滚动时应用程序停止从套接字接收数据

    我有一个使用 UDP 套接字接收数据的 iPad 应用程序 并且它有一个UIWebView来浏览网页 但是在 UIWebView 中进行滚动时 一切都会冻结并且没有收到任何数据 我一直在搜索 它与运行循环和线程有关 但是 如果 UIWebV
  • C# 多线程控制台应用程序 - 控制台在线程完成之前退出

    我有一个 C 控制台应用程序 最多可创建 5 个线程 线程执行良好 但 UI 线程在完成工作后关闭 有没有办法让主 UI 线程在副线程运行时保持运行 foreach var url in urls Console WriteLine sta
  • Google Apps 自定义域 SSL 已配置但连接失败

    我已按照以下步骤操作https cloud google com appengine docs ssl https cloud google com appengine docs ssl and https support google c
  • 不同浏览器窗口中的 JSF 会话问题

    我们有一个基于 JSF 2 0 MyFaces 构建并在 Weblogic 应用服务器上运行的应用程序 我们面临一个有关 http 会话的问题 Issue 假设我在两个不同的 IE 窗口中打开应用程序 并在第一个窗口中提供一些搜索输入 在第
  • R:考虑因素按周计算移动最大坡度

    我有一个数据框 其中包括下面的供暖度日 HDD structure list WinterID structure c 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L 1L
  • mysql 分区

    只是想验证数据库分区仅在数据库级别实现 当我们查询分区表时 我们仍然执行正常查询 我们的查询没有什么特别的 解析查询时会自动执行优化 对吗 例如我们有一个名为 地址 的表 其中有一列名为 国家 地区代码 和 城市 所以如果我想获得美国纽约的
  • 如何创建 RSS 提要并显示它?

    在我为广播电台维护的网站上 他们有一个显示新闻文章的页面 现在新闻发布在一个 html 页面中 然后由包含所有导航的 php 页面读取 我被要求将其制作成 RSS 源 我该怎么做呢 我知道如何制作 XML 文件 但编辑新闻文件的人缺乏技术
  • 避免在 Android 上尝试/捕获

    我是 Android 环境的新手 我已经开始编写一些代码来对数据库执行一些查询 当我必须处理异常时 我不知道正确的方法是什么 我曾经使用过 Androidthrows方法声明 但似乎throws安卓不允许吗 只是try catch 我这样说
  • 使用 VBA 以编程方式安装 Microsoft Access 加载项

    查找有关 Microsoft Access 加载项开发的信息就像拔掉所有牙齿一样 是的 我发现了几篇托管加载项文章 但几乎找不到非托管加载项的内容 我确实找到了一篇很棒的文章 它在创建基本上是一个非托管的 mda 项目方面非常古老 我已经遵
  • PIP 在 Windows 8 上的哪里存储/保存 Python 3 模块/包?

    我到处都找过了 但找不到软件包的安装位置 此外 包裹是来自pip questions tagged pip 模块 库或只是包python questions tagged python术语 使用此命令列出全局包及其位置 pip list v
  • Gradle 获得“sudo”权限

    我有下一个问题 我需要使用 Gradle 在服务器上执行一些部署内容 但为此 Gradle 应该在目标部署服务器上具有 root 访问权限 我有 sudo 的密码 但我不知道如何将其插入服务器 有没有办法从 Gradle 任务中获得 sud
  • 注释属性必须是类文字吗?为什么?常量也应该没问题

    有人可以解释为什么字符串和类注释参数的预期不同吗 为什么编译器需要类的文字 同时也接受字符串的常量 使用 Spring 的 RequestMapping 的工作示例 public class MyController public stat
  • UIView 动画后 UIView 内的 UIButton 不起作用

    我在这个论坛上看到了很多问题 这些问题给出了这个主题 UIButton inside a UIView when animated does not work 的答案 但是在尝试了类似的答案之后 a UIViewAnimationOptio
  • R 中的函数工厂

    我尝试通过返回专门函数的字典来提出一个函数工厂 或多或少类似于函数式编程风格 我尝试在下面的代码中执行此操作 require hash names c aa bb cc funs hash for i in seq length names