对所有参数组合应用函数

2024-01-04

我希望能够将函数应用于一组输入参数的所有组合。我有一个可行的解决方案(如下),但如果没有更好/更通用的方法来执行此操作,例如,我会感到惊讶plyr,但到目前为止还没有发现任何东西。有更好的解决方案吗?

# Apply function FUN to all combinations of arguments and append results to
# data frame of arguments
cmapply <- function(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, 
    USE.NAMES = TRUE)
{
    l <- expand.grid(..., stringsAsFactors=FALSE)
    r <- do.call(mapply, c(
        list(FUN=FUN, MoreArgs = MoreArgs, SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES), 
        l
    ))
    if (is.matrix(r)) r <- t(r) 
    cbind(l, r)
}

例子:

# calculate sum of combinations of 1:3, 1:3 and 1:2
cmapply(arg1=1:3, arg2=1:3, 1:2, FUN=sum)

# paste input arguments
cmapply(arg1=1:3, arg2=c("a", "b"), c("x", "y", "z"), FUN=paste)

# function returns a vector
cmapply(a=1:3, b=2, FUN=function(a, b) c("x"=b-a, "y"=a+b))

这个函数不一定更好,只是略有不同:

rcapply <- function(FUN, ...) {

  ## Cross-join all vectors
  DT <- CJ(...)

  ## Get the original names
  nl <- names(list(...))

  ## Make names, if all are missing
  if(length(nl)==0L) nl <- make.names(1:length(list(...)))

  ## Fill in any missing names
  nl[!nzchar(nl)] <- paste0("arg", 1:length(nl))[!nzchar(nl)]
  setnames(DT, nl)

  ## Call the function using all columns of every row
  DT2 <- DT[,
            as.data.table(as.list(do.call(FUN, .SD))), ## Use all columns...
            by=.(rn=1:nrow(DT))][ ## ...by every row
              , rn:=NULL] ## Remove the temp row number

  ## Add res to names of unnamed result columns
  setnames(DT2, gsub("(V)([0-9]+)", "res\\2", names(DT2)))

  return(data.table(DT, DT2))
}

head(rcapply(arg1=1:3, arg2=1:3, 1:2, FUN=sum))
##    arg1 arg2 arg3 res1
## 1:    1    1    1    3
## 2:    1    1    2    4
## 3:    1    2    1    4
## 4:    1    2    2    5
## 5:    1    3    1    5
## 6:    1    3    2    6

head(rcapply(arg1=1:3, arg2=c("a", "b"), c("x", "y", "z"), FUN=paste))
##    arg1 arg2 arg3  res1
## 1:    1    a    x 1 a x
## 2:    1    a    y 1 a y
## 3:    1    a    z 1 a z
## 4:    1    b    x 1 b x
## 5:    1    b    y 1 b y
## 6:    1    b    z 1 b z

head(rcapply(a=1:3, b=2, FUN=function(a, b) c("x"=b-a, "y"=a+b)))
##    a b  x y
## 1: 1 2  1 3
## 2: 2 2  0 4
## 3: 3 2 -1 5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对所有参数组合应用函数 的相关文章

随机推荐

  • 在Google Play商店中,如果生产版本高于测试版本会发生什么?

    假设我当前的版本如下 生产版本代码 1Beta 版本代码 2 只要测试版是最新的代码就一切OK 如果我在生产中更新新版本 版本 3 会发生什么 生产版本代码 3Beta 版本代码 2 我的问题是安装了 versionCode 2 的 bet
  • 从matlab绘图中获取平均值?

    当我有图表时 我有一个简单的图 其中包含大量数据点 有没有一种方法可以让我简单地单击所有这些点并让 matlab 给出它们的平均值 谢谢 另一种选择是使用数据刷 http www mathworks com access helpdesk
  • Laravel Spark 不显示存储在 /storage/app/public/profiles/ 目录中的图像

    上传的图像默认为 storage app public profiles 但前端生成的 URL 为 storage profiles image没有被发现 我尝试为该目录找到任何类型的路由 但未能成功 任何帮助 将不胜感激 您必须链接到存储
  • 转换匿名数组初始值设定项列表

    我可以成功地对 char 字符串数组进行初始化列表的 C 转换 但似乎无法使其与 C 转换 static cast 一起使用 int main char x test 123 This works fine char foo char a
  • 同一 NHibernate Linq 查询中的 Cacheable()、FetchMany() 和 ToFuture()

    存在类似于以下示例的情况 1 个父实体Employee有 2 个子集合 Addresses and Phones 我需要检索single roundtrip所有员工的地址和电话均已初始化 并且cache the query在二级缓存中使用C
  • 正则表达式从英国邮政编码获取区号

    基本上 我需要一个正则表达式来匹配英国邮政编码中的第一个字母序列 简单 和另一个正则表达式来匹配以下数字 不那么容易 可能的组合和匹配示例 AA9A 9AA regex1 AA regex2 9 A9A 9AA regex1 A regex
  • 使用 moment.js 显示本地时区名称

    我在用moment js并想向用户展示本地时区名称 http momentjs com timezone docs using timezones guessing user timezone 例如 CET 或 PST 使用 var tim
  • 将图像置于 Twitter 引导导航栏中居中

    这是我的实时网站 http ancient badlands 4040 herokuapp com http ancient badlands 4040 herokuapp com 我试图将图像居中 并使链接与图像垂直对齐 读完这篇文章后
  • Java 有“可视化调试器”吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何 Java 调试器可以显示运行某些代码行时实际发生的情况的逐步动画 我的朋友问了很多Java问题 我现在不知道能否沟通 我也不知
  • 从图库中选定的图像中获取图像的确切文件大小

    这是我的文件选择器代码 private void showFileChooser Intent intent new Intent intent setType image intent setAction Intent ACTION GE
  • React Native Android Bridge 错误:必须在主线程上调用方法 addObserver

    我正在使用 Wootrick SDK 创建一个反应本机的桥梁 当我调用特定函数时 我会收到以下日志 但 Wootric Survey 不会显示 java lang IllegalStateException Method addObserv
  • 在 IntelliJ 中为 Scala 项目设置 Javadoc

    设置 Scaladoc 后 我发现 IDE 中仍然缺少一些文档 在我看来 非常感谢Peter https stackoverflow com users 57695 peter lawrey注意到这一点 非粗体的函数没有文档 粗体字的功能只
  • 无法捕获 playwright 中的 response.json()

    我正在尝试使用 playwright 捕获 json 响应 我不断收到待处理的 Promise 但是 在 headless false 模式下 我可以看到数据正在被接收并填充在浏览器上 我刚刚开始玩Playwright 对 Promise
  • sqlite错误没有这样的列[重复]

    这个问题在这里已经有答案了 这里有人对这个错误有一些经验吗 仅当我使用 WHERE 子句时 才会出现此错误 我使用 php PDO 来获取结果 这是我的简单桌子 sql CREATE TABLE samenvatting stem id I
  • 输出/打印“可读”字典

    我正在准备一个api 并使用文档字符串作为文档 api 服务选择相关的 ApiClass 方法并连接每个文档字符串以创建文档 这样 程序开发人员和 API 用户都可以获得相同的文档 我的班级结构是这样的 API STATUS 1 some
  • Android:如何在设置背景可绘制时保持角半径?

  • 如何在 Vim 中使用“wildignore”?

    我在弄清楚语法时遇到了很多麻烦wildignoreVim 中的设置 假设我想要我的文件查找器插件 我使用Ctrlp http kien github com ctrlp vim 它使用wildignore 不搜索隐藏的文件和文件夹 即以 a
  • 如何删除树枝中数组的第一项?

    我在树枝中有一个名为 Posts 的数组 有没有办法轻松删除该数组的第一项 所以它的结构就像这样 array post 1 post 2 post 3 我想知道是否可以使用 twig 中的函数轻松删除第一篇文章 array post 2 p
  • 如何使表单的特定部分可滚动?

    我正在用 vb6 编写一个程序 要求我能够向右滚动屏幕的某个区域 它仅由线条和图片框组成 有没有办法只滚动该区域 谢谢 您可以利用以下事实 某些可视控件可以充当其他可视控件的容器 举个例子 在 VBIDE 中 放置一个Frame通过 VB
  • 对所有参数组合应用函数

    我希望能够将函数应用于一组输入参数的所有组合 我有一个可行的解决方案 如下 但如果没有更好 更通用的方法来执行此操作 例如 我会感到惊讶plyr 但到目前为止还没有发现任何东西 有更好的解决方案吗 Apply function FUN to