使用 rlang 将权重传递给 glm()

2023-12-08

我想通过weights to glm()通过函数而无需使用eval(substitute()) or do.call()方法,但使用rlang.

这描述了一个更复杂的底层函数。

# Toy data
mydata = dplyr::tibble(outcome = c(0,0,0,0,0,0,0,0,1,1,1,1,1,1),
                                group = c(0,1,0,1,0,1,0,1,0,1,0,1,0,1),
                                wgts = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1)
)

# This works
glm(outcome ~ group, data = mydata)                             

# This works
glm(outcome ~ group, data = mydata, weights = wgts)                             

library(rlang)
# Function not passing weights
myglm <- function(.data, y, x){
    glm(expr(!! enexpr(y) ~ !! enexpr(x)), data = .data)
}

# This works
myglm(mydata, outcome, group)

# Function passing weights
myglm2 <- function(.data, y, x, weights){
    glm(expr(!! enexpr(y) ~ !! enexpr(x)), `weights = !! enexpr(weights)`, data = .data)
}

# This doesn't work
myglm2(mydata, outcome, group, wgts)

(勾号是为了突出显示)。

我知道这里的权重参数是错误的,我尝试了很多不同的方法都没有成功。实际的函数将被传递给一个版本purrr:map() or purrr:invoke(),这就是为什么我想避免简单的do.call()。非常感谢您的想法。


问题是glm()可以识别提供给其的表达式weights参数,但不支持准引用,因为它使用基数quote() / substitute() / eval()机制而不是rlang. 这会导致嵌套表达式算术出现问题.

解决这个问题的一种方法是将整个glm表达式,然后对其求值。您可以使用...提供可选参数。

myglm2 <- function( .data, y, x, weights, ... ) {
  myglm <- expr( glm(!!enexpr(y) ~ !!enexpr(x), data=.data, 
                      weights = !!enexpr(weights), ...) )
  eval(myglm)
}

myglm2(mydata, outcome, group)
# Call:  glm(formula = outcome ~ group, data = .data)

myglm2(mydata, outcome, group, wgts)
# Call:  glm(formula = outcome ~ group, data = .data, weights = wgts)

myglm2(mydata, outcome, group, wgts, subset=7:10)
# Call:  glm(formula = outcome ~ group, data = .data, weights = wgts, 
#     subset = ..1)
# While masked as ..1, the 7:10 is nevertheless correctly passed to glm()

要遵循@lionel的建议,您可以将表达式组合/评估封装到独立函数中:

value <- function( e ) {eval(enexpr(e), caller_env())}

myglm2 <- function( .data, y, x, weights, ... ) {
  value( glm(!!enexpr(y) ~ !!enexpr(x), data=.data, 
              weights = !!enexpr(weights), ...) )
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 rlang 将权重传递给 glm() 的相关文章

随机推荐

  • Spring表单:输入HTML5必需的属性

    我正在使用 Spring 表单 并且想使用 Spring 表单似乎不支持的 HTML5 required 属性
  • 导航到不同 ViewController 时 BLE 外设断开连接

    我正在开发具有多个 ViewController 的 BLE iOS Swift 应用程序 主 ViewController 有一个按钮 可导航到 TableViewController 该按钮已检测到要连接的 BLE 设备 但是 当我返回
  • 当 STDIN、STDOUT 和 STDERR 关闭时 perl bug?

    当编写守护进程时 我想关闭 STDIN STDOUT 和 STDERR 以实现 良好的守护进程行为 但我很惊讶 随后打开的文件需要与旧的 STDIN STDOUT 和 STDERR 相同的属性 因为它们的 fileno s 被重新打开 这是
  • XML 中“图像上缺少 contentDescription 属性”

    我收到一条警告 辅助功能 图像上缺少 contentDescription 属性在日食中 此警告显示在第 5 行 声明ImageView 在下面的 XML 代码中 构建和运行我的应用程序时不会出现任何错误 但我真的很想知道为什么我会收到这个
  • 如何找到有关文件描述符的更多信息?

    我正在尝试调试一个挂起的进程 进程 id 的 strace 输出有最后一行 recvfrom 9
  • 在 Android 上以静音模式播放声音时出现问题

    我正在编写一个Android应用程序 无论手机处于何种模式 即使它处于静音模式 都可以简单地播放闹钟 我找到了这个question并使用答案中的代码来覆盖当前的音量状态 我的代码如下所示 Uri alert RingtoneManager
  • 如何在WordPress中使用媒体上传来上传视频文件?

    我有一个帖子类型 用于在 WordPress 中上传横幅 使用名称 图像 视频和 url 的自定义字段 默认媒体上传可以很好地上传图像 视频 但我的问题是我无法将视频基本网址获取到自定义字段 这是我的代码 无法获取视频网址 它只给我视频文件
  • Mapstruct:使用加法器时清除更新集合

    我尝试将 DTO 对象映射到 JPA 实体 我有一个集合children in my ParentEntity 可以添加它们addChild Mapstruct 通过以下方式支持使用加法器CollectionMappingStrategy
  • JButton() 仅在鼠标悬停时起作用

    import java awt import java awt image import java awt event import javax imageio import java lang import java io import
  • json.net 将字符串反序列化为嵌套类

    我收到从 http 请求返回的 Json 字符串 如下所示 info calls 0 errors error1 error2 error3 messages 0 mail 3 received 5 valid 3 我试图反序列化的实体的结
  • 如何在 MySQL 替换命令中使用正则表达式?

    我的目标是用包罗万象的链接替换数据库中的链接 我通常使用 REPLACE 命令来替换数据库中的字符串 但这次我遇到了困难 因为为了找到链接 我需要使用正则表达式 而这根本行不通 UPDATE node revisions SET body
  • R 抑制依赖项中的startupMessages

    我的 R 包的依赖项之一在加载时显示启动消息 我想抑制这些启动消息 到目前为止 我发现的唯一修复是从我的描述文件中的 Depends 行中删除有问题的包 然后打电话suppressPackageStartupMessages require
  • Android 选项卡 - 开始一个新活动

    TabHost 中有 4 个选项卡 分别是 A B C 和 D 现在每个选项卡只是一个索引页 单击其中任何一个都会显示不同的活动 问题是 当用户从选项卡中显示的内容中选择某些内容时 我需要启动另一个活动 其他活动也应该显示在父选项卡本身中
  • 使用谷歌分析跟踪重定向页面

    我正在尝试使用谷歌分析跟踪重定向页面 我有一个名为redirect php 当我访问像这样的网址时redirect php c 12345678 一个 php 函数对 sql 查找表进行查询以解码代码12345678使用先前插入的 url
  • 有条件地生成表格行中断

    我有一个 table 有两个单元格 如果设备是计算机 我想水平显示 如果设备是移动设备 我想垂直显示 我借用了一个JS函数来从这个答案中检测移动设备https stackoverflow com a 11381730 3298930效果很好
  • 在 PyGame 中,如何在不使用 sleep 函数的情况下每 3 秒移动一个图像?

    最近我学习了一些基本的Python 所以我正在使用PyGame编写一个游戏来提高我的编程技能 在我的游戏中 我想每3秒移动一个怪物的图像 同时我可以用鼠标瞄准它并点击鼠标射击它 一开始我尝试使用时间 睡眠 3 但结果却暂停了整个程序 并且我
  • iCloud 仪表板:无法将 CloudKit 架构部署到生产环境 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个已发布的应用程序 具有现有的生产模式 我对开发模式进行了更改 现在我想部署到生产中 点击后Deploy Schema to Production 弹出对话框显示The
  • Python 中的 CSV 在 Windows 上添加额外的回车符

    import csv with open test csv w as outfile writer csv writer outfile delimiter quoting csv QUOTE MINIMAL writer writerow
  • Python Tkinter 滑块自定义

    I m new with tkinter and I want to create a slider like the one in this picture 但我不知道这是否可能 所以我的问题是 这可能吗 有人为我提供快速教程或其他东西吗
  • 使用 rlang 将权重传递给 glm()

    我想通过weights to glm 通过函数而无需使用eval substitute or do call 方法 但使用rlang 这描述了一个更复杂的底层函数 Toy data mydata dplyr tibble outcome c