首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

do.call强制在rlang的整洁计算之前进行参数计算

do.call 是 R 语言中的一个函数,它允许你调用一个函数,并将一个列表或向量作为参数传递给这个函数。这在某些情况下非常有用,尤其是当你不确定参数的具体数量或者参数是以列表的形式给出时。

基础概念

在 R 语言中,do.call 的基本语法如下:

代码语言:txt
复制
do.call(fn, args, quote = FALSE)
  • fn 是你想要调用的函数。
  • args 是一个列表,包含了传递给 fn 的参数。
  • quote 是一个逻辑值,如果为 TRUE,则 args 中的表达式不会被立即求值。

相关优势

  1. 灵活性do.call 允许动态地构建函数调用,这在处理不确定数量或类型的参数时非常有用。
  2. 简洁性:相比于手动展开参数列表,使用 do.call 可以使代码更加简洁。

类型与应用场景

do.call 可以用于多种类型的数据和函数,常见的应用场景包括:

  • 合并数据框:使用 rbindcbind 结合 do.call 来合并多个数据框。
  • 应用函数到列表元素:如果你有一个函数和一个列表,你想将这个函数应用到列表的每个元素上,可以使用 lapplydo.call
  • 动态函数调用:在编写通用脚本或函数时,可能需要根据输入动态地调用不同的函数。

遇到的问题及原因

在使用 do.call 时,可能会遇到的问题之一是在整洁计算(tidy evaluation)之前强制进行参数计算。这是因为 do.call 默认会立即求值 args 中的表达式,而整洁计算框架(如 rlang)通常会在函数调用时延迟表达式的求值,直到它们真正需要被计算的时候。

解决方法

如果你需要在整洁计算的上下文中使用 do.call,并且希望延迟参数的计算,你可以设置 quote = TRUE。这样,args 中的表达式就不会被立即求值,而是作为表达式对象传递给函数。

代码语言:txt
复制
library(rlang)

# 假设我们有一个整洁计算的函数
tidy_function <- function(expr) {
  # 这里可以进行一些整洁计算的操作
  eval_tidy(expr)
}

# 我们想要延迟计算的参数
param <- quote(x + y)

# 使用 do.call 并设置 quote = TRUE 来延迟计算
result <- do.call(tidy_function, list(expr = param), quote = TRUE)

在这个例子中,param 是一个未求值的表达式,它被传递给 tidy_function,在那里它会被整洁计算框架处理。

示例代码

下面是一个更具体的例子,展示了如何在整洁计算的上下文中使用 do.call

代码语言:txt
复制
library(dplyr)
library(rlang)

# 创建一个数据框
df <- tibble(x = 1:3, y = 4:6)

# 定义一个整洁计算的函数
summarise_column <- function(data, column) {
  summarise(data, mean = mean(!!sym(column)))
}

# 我们想要延迟计算的列名
column_name <- "x"

# 使用 do.call 并设置 quote = TRUE 来延迟计算列名
result <- do.call(summarise_column, list(data = df, column = column_name), quote = TRUE)

print(result)

在这个例子中,column_name 是一个字符串,它代表了我们想要计算平均值的列名。通过设置 quote = TRUE,我们确保了 column_name 在传递给 summarise_column 函数之前不会被立即转换为符号并求值。

总之,do.call 是一个强大的工具,但在与整洁计算框架结合使用时需要注意参数的求值时机。通过合理设置 quote 参数,可以有效地控制参数的计算时机。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ECCV 2022 | 在视觉Transformer上进行递归,不增参数,计算量还少

目前 vision transformer 在不同视觉任务上如分类、检测等都展示出了强大的性能,但是其巨大的参数量和计算量阻碍了该模型进一步在实际场景中的应用。...基于这个考虑,本文重点研究了如何在不增加额外参数量的前提下把模型的表达能力挖掘到极致,同时还要保证模型计算量在合理范围内,从而可以在一些存储容量小,计算能力弱的嵌入式设备上部署。...来近似 vanilla global self-attention,在显著降低计算量 FLOPs 的同时,模型没有精度的损失。...; 如下图所示,本文所提出的模型在参数量(Params)和计算量(FLOPs)方面相比其他模型都有明显的优势: 下面我们来解读这篇文章: 1.ViT 中的递归模块 递归操作的基本组成模块如下图: 该模块非常简单明了...具体而言,研究者在每个模块里面添加了 6 个额外参数(4+2,2 个在 NLL 层),这些参数会跟模型其他参数一起学习,从而使网络拥有更强的表达能力,参数初始化都为 1,在训练过程 6 个参数的数值变化情况如下所示

27720

ECCV2022:在Transformer上进行递归,不增参数,计算量还少!

转自《机器之心》 目前 vision transformer 在不同视觉任务上如分类、检测等都展示出了强大的性能,但是其巨大的参数量和计算量阻碍了该模型进一步在实际场景中的应用。...基于这个考虑,本文重点研究了如何在不增加额外参数量的前提下把模型的表达能力挖掘到极致,同时还要保证模型计算量在合理范围内,从而可以在一些存储容量小,计算能力弱的嵌入式设备上部署。...来近似 vanilla global self-attention,在显著降低计算量 FLOPs 的同时,模型没有精度的损失。...类似的 group self-attention 来降低 FLOPs 的同时保持模型的高精度; 此外,本文还有其他一些小的改动: 网络最前面使用三层连续卷积,卷积核为 3x3,结构直接使用了研究者之前...具体而言,研究者在每个模块里面添加了 6 个额外参数(4+2,2 个在 NLL 层),这些参数会跟模型其他参数一起学习,从而使网络拥有更强的表达能力,参数初始化都为 1,在训练过程 6 个参数的数值变化情况如下所示

33020
  • ECCV 2022 | 在视觉Transformer上进行递归,不增参数,计算量还少

    目前 vision transformer 在不同视觉任务上如分类、检测等都展示出了强大的性能,但是其巨大的参数量和计算量阻碍了该模型进一步在实际场景中的应用。...基于这个考虑,本文重点研究了如何在不增加额外参数量的前提下把模型的表达能力挖掘到极致,同时还要保证模型计算量在合理范围内,从而可以在一些存储容量小,计算能力弱的嵌入式设备上部署。...来近似 vanilla global self-attention,在显著降低计算量 FLOPs 的同时,模型没有精度的损失。...; 如下图所示,本文所提出的模型在参数量(Params)和计算量(FLOPs)方面相比其他模型都有明显的优势: 下面我们来解读这篇文章: 1.ViT 中的递归模块 递归操作的基本组成模块如下图: 该模块非常简单明了...具体而言,研究者在每个模块里面添加了 6 个额外参数(4+2,2 个在 NLL 层),这些参数会跟模型其他参数一起学习,从而使网络拥有更强的表达能力,参数初始化都为 1,在训练过程 6 个参数的数值变化情况如下所示

    39410

    R tips: rlang中的expression操作符

    在R中,library函数的表现有点特殊,传给它的参数变量不是类似于常规R表达式的即时执行,而是像是被‘冻结’了一样。...这个现象在tidyverse系列包中大量存在,而且很多时候这个特性都可以简化操作。rlang包中有对这个“冻结”特性的诸多处理机制,其中比较有意思的是下面的几个特殊操作符。 !!和!!!...在rlang包中,expr函数类似于expression函数(expr函数暂停后的代码对象是call,基本上和expression是一个意思就行,以下统一使用expression),而eval_tidy...不要忘记将左侧构建的参数名包括在引号中,因为等号左侧是形参,只能是字符串或者symbol: add2(!!x1 := 1, '{x2}' := 2) #[1] 3 add3(!!...进行强制执行为它的值:一个字符串‘Species’,也可以进一步转换为symbol以满足dplyr的选择变量的语法。 {{}}是执行冻结的变量值的值 {{}}其实就是!!

    1.5K10

    124-R编程18-R的内部机制2

    工作空间和变量赋值 · 语雀 (yuque.com)[3] 前言 其实之前读了李东风老师的内容,感觉收获颇丰;但因为自己的业务逻辑过于简单,渐渐又荒废掉了。..., 仍与x的各个元素指向的对象相同;然后, y[[3]]指向的元素值进行了重新绑定, 不再指向x[[3]], 而是指向新的保存了值0的对象, 但y的其它元素指向的对象仍与x公用。...在R的3.1.0之前则用的深拷贝方法, 即复制列表时连各个元素保存的值也制作副本。...,数据框和列表并没有什么明显的区别: 只不过从操作上,我们可以对不同列表的相同位置的数据进行同时处理(行操作)。...如果我们在环境中定义的名字相同,则会将之前的名称覆盖: e3 rlang::env( a = 4, a = 2 ) > e3$a [1] 2 我们打印环境,会输出十六进制数表示的内存地址

    64750

    独家 | 不同机器学习模型的决策边界(附代码)

    标签:机器学习 作者前言 我使用Iris数据集训练了一系列机器学习模型,从数据中的极端值合成了新数据点,并测试了许多机器学习模型来绘制出决策边界,这些模型可根据这些边界在2D空间中进行预测,这对于阐明目的和了解不同机器学习模型如何进行预测会很有帮助...数据集包含有关英国统计员Ronald Fisher在1936年收集的3种不同植物变量的信息。...LightGBM模型 在许多组合中,Keras神经网络模型只是预测所有观测值都属于某一类别(同样,我对模型没有进行很多调整,以及模型只有100个观测值来训练却要对40,000个点进行预测)。...也就是说它将整个背景颜色染成蓝色或红色,并进行了许多错误分类。在某些图中,神经网络可以实现完美的分类,而在另一些图中则做出了奇怪的决策边界---神经网络很有趣。...翻译组招募信息 工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

    1.9K40

    R语言批量拼接遥感影像

    此时,tif_file_name变量中存放的是指定文件夹下的全部栅格遥感影像的文件名称,而不是遥感影像文件自身;而接下来我们进行拼接、融合的函数,都需要保证函数参数中的遥感影像是一个栅格对象(Raster...因此,我们可以通过$运算符,将mosaic()函数所需要的其他参数一并放入tif_file_list中,在后期do.call()函数调用mosaic()函数时,将同时读取这些参数,起到将参数传递到mosaic...其中,在本文中我们需要指定mosaic()函数的fun参数与na.rm参数,二者分别是指拼接时重叠区域像元值的计算方法,以及计算重叠区域像元值时,是否考虑NoData值的影响;我们将这2个参数分别设定为...max与TRUE,二者分别是指重叠区域的像元以2景遥感影像中的最大值像元为准,以及在计算时不考虑NoData值的影响。   ...其实,这里的merge()函数与前述的mosaic()函数功能大致一样,但merge()函数在处理重叠区域时,默认选择位于顶层的遥感影像的像元数值,就没有mosaic()函数中的这么多计算方法选择了。

    28510

    【Debug】如何顺利的重复别人的画图代码?一名Geek粉丝的Debug历程

    第一个图很爽 【画图】SARS-CoV-2结合的宿主细胞受体ACE2在人组织中的表达情况 话说上次站长画了一个图,还公布了代码,我照搬过来很是爽了一下,相当于白piao了站长一回,不过用read.csv...可是万万没想到,居然报错了,大概意思就是只有字符串能够转换为symbol,这就奇怪了,同样的代码在站长的机器上跑就没有错误呀。...简单搜索一下就发现了,原来它还有个兄弟函数叫 rlang::sym( ),rlang::ensym( )的好处是不管字符串加不加引号,都可以转化为字符串,但是,非常坑的地方是rlang::ensym(...)函数在转化字符串的时候,会先判断参数时候是函数,说到这里是不是有点晕了,直接看例子吧: 看到没有,如果rlang::ensym( ) 里面即使放一个向量也是不可以的,必须是字符串,而rlang ::...那么推测原因,ggstatsplot包之前的版本用的是 rlang :: sym ( ) 函数,而新版本的时候作者脑子抽风改成了 rlang::ensym ( )。 那么问题找到了,该怎么办呢?

    30720

    109-R可视化33-通过seurat包中的LabelClusters学习ggplot之二

    ,这里的语法限制了传入的group 列必须得是factor 类型(强制转型成字符串进行判断);以及数据框需要是dataframe 类型(x[,'y']取子集操作对于table 类型数据框并不会转型成向量...—— 计算每个分组cluster 的统计数据,比如中位数,来对这个位置进行计算。...我已经在之前不记得的某期介绍过了,其可以接受函数,批量对列表的子元素进行操作。...其实你可以理解成split 就是对group 的额外分组,那自然也是额外再分组再分别进行一层统计数目计算。 就不展开了。...labels 长度是否等长; 将外部等长labels 名称和labels 的内部id 替换; 绘图函数 在ggplot 家族中,我们介绍过两种label 方式:[[66-R可视化10-自由的在ggplot

    1K10

    「R」do.call 的妙用——参数更新

    R 中的 do.call() 是我极少用到的一个函数,不过它在很多情况下是蛮有用的,之前我也做过简单的介绍。...它可以在实际调用函数时将参数以列表的形式传入,下面是一个简单的函数: f <- function(x) print(x^2) 我们可以用下面的方式调用 do.call(): do.call(f, list...最近我需要批量更新参数时发现了 do.call() 的好用之处。 在批量建模时可能需要比较对建模函数设定不同的参数,我们以求和函数作为建模函数举例。...,而且只修改其中 3 个参数,另外参数是外部定义的,比如说其他使用这个函数的人。...Sum(d = 1, b = 3, c = 5) #> [1] 10 这并不能直接通过 for 循环、apply 之类的操作进行批量调用。我们来看看 do.call() 如何解决这个问题。

    89010

    R语言实现并行计算

    Python作为多线程的编程语言在并行方面相对于R语言有很大的优势,然而作为占据统计分析一席之地的R语言自然不能没有并行计算的助力。...所谓显式并行也就是基于并行的编程语言编译的程序;隐式并行是基于串行程序编译的并行计算。当然,在R语言核心功能中也是带有了相关的并行的计算基础包parallel。...今天就给大家介绍下这个基础并行包的具体应用。 我们不需要再安装这个包,可以直接进行相关的计算。首先我们看下里面的几个核心的函数: 1. detectCores() 发现PC终端有多少个核。...8. do.call() 针对某个数据集执行指定的函数功能。...实例 stopCluster(cl) 以上便是parallel包的全部功能函数,其实并行真正解决的是重复性工作的情况,在P值的计算中应用比较广泛。

    3K31

    架构整洁之道导读(一)

    拿到译文初稿时,编辑提供了几个备选的译名:《架构简洁之道》,《架构至洁》和《Clean Architecture》,这些名字各有各的考量,在没有了解这本书的核心思想之前,我也没有办法给出恰当的判断。...所以在通读了原作和译作之后,我在ThoughtWorks咨询群里发起提案,讨论的过程很精彩,最终在骨灰级架构师新哥的建议下,结果大致趋向了整洁架构。...去除了goto语句之后,我们发现具备顺序,循环和分支判断能力的计算过程还是图灵完备的,也就是说goto的有无并不会影响计算能力。那么goto的在程序中的作用便是弊大于利的。...面向对象的世界里,我们不再需要手动强制转换,只要通过显式地表明继承关系,编程语言就能在运行时自动做到这点。...多态(polymorphism)是一种将不同的特殊行为和单个泛化记号相关联的能力,和多态概念对应的参考实现——运行哪段代码的决策叫做分派,大部分分派基于类型,也可以基于方法参数的个数及其类型,而分派的具体执行过程则仰仗函数指针

    1.7K80

    「R」ggplot2在R包开发中的使用

    而这两个函数都使用了非标准计算,如果你在包中直接使用它,后面再CMD check的使用会引入一个note。 所有的Error, warning和note都需要解决才能上传到CRAN。...由用户指定列名和表达式,而你想要你的函数能够有aes()同样的方式执行非标准计算。 如果你已经像上面的例子一样事先知道了列名,你可以使用来自rlang[2]的代词.data指代你要使用的图层数据。...这种tidy eval计算符号会捕捉用户提供的表达式,并将其传递给使用非标准计算的函数,如aes()或vars()。...element_blank(), panel.grid = element_line(colour = "grey80") ) } mpg_drv_summary() + theme_custom() 在加载包之后计算主题是很重要的...如果你想要将它列入Suggests,那么你不能使用#' @importFrom ggplot2 ...载入函数,但是如果你仍然想要使用ggplot2的像%+replace%这样的中缀操作符号,你可以在函数中进行赋值

    6.7K30

    科研绘图系列:R语言绘制微生物物种系统发育树(phylogenetic tree)

    它利用生物的形态特征、分子序列(如DNA、RNA或蛋白质序列)等数据,通过数理统计算法来计算生物之间的进化关系,从而构建出一个反映物种进化历史的拓扑结构。...构建方法构建系统发育树的方法主要有以下几种:距离法(Distance-based methods):基于物种之间的进化距离,通过计算和比较序列之间的差异来构建树。...p1:基础的圆形系统发育树,节点颜色根据 group 变量着色。p2:在 p1 的基础上添加了条形图,展示每个节点的 MAGs 值。p3:在 p2 的基础上添加了热图,展示 bacDatset 数据。...p4:在 p3 的基础上添加了第二个热图,展示 bactcov 数据。...变量进行着色。

    22410
    领券