如何为继承的槽定义 S4 原型

2023-12-26

我有一个基类(我们称之为“A”),其表示对于许多其他类来说是通用的。

因此我定义了其他类,例如“B”,来包含这个类。

我想设置这些其他类 (B) 的原型以包含从 A 继承的插槽的默认值。我认为这是很自然的:

setClass("A", representation(a="character"))
setClass("B", contains="A", prototype(a = "hello"))

但它会产生错误:

Error in representation[!slots] : object of type 'S4' is not subsettable

不知道为什么会发生这种情况。如果我省略原型我可以这样做:

setClass("B", contains="A")

然后破解我自己的生成器函数:

new_B <- function(...){ 
           obj <- new("B", ...)
           obj@a = "hello"
           obj
         }

然后根据原型创建我的对象new_B(),但是与使用通用生成器相比,这是非常粗糙和丑陋的new("B")并拥有我的原型......


补充我的评论而不是提供问题的新答案,这是一个解决方案,我们仍然按位置匹配参数(因为我们为 B 类指定了附加表示):

.A <- setClass("A", representation(a="character"))
.B <- setClass("B", representation(b="numeric"),
     prototype(a="hello"),
     contains="A")

.A() and .B()替换呼叫new("A") and new("B")。在某种程度上,这是语法糖,但可以使对象构造更加透明

## construct an object using B's prototype, like new("B", b=1:3)
> .B(b=1:3)
An object of class "B"
Slot "b":
[1] 1 2 3

Slot "a":
[1] "hello"

## construct an object using A's prototype, like new("B", new("A"), b=1:3)
> .B(.A(), b=1:3)
An object of class "B"
Slot "b":
[1] 1 2 3

Slot "a":
character(0)

(第二个示例使用了以下事实:未命名参数new or B用于初始化继承的类)。

对于用户来说使用起来不太友好.A or .B直接,例如,因为签名只是...因此将被记录为“参见 A 类插槽的定义”。这破坏了接口和实现的分离,而这是 OOP 的优势。此外,最后一个代码块中的一个或另一个行为(.B(.A(a=a), b=b) or .B(a=a, b=b))可能不是本意。因此,提供一个函数is暴露给用户,也许做一些初始数据按摩

A <- function(a=character(), ...) {
    ## nothing special, just a public constructor
    .A(a=a, ...)
}

B <- function(b, a="hello", ...) {
    a <- tolower(a)  ## no SHOUTing!
    .B(A(a=a), b=b)  ## A's public interface; no need for B to know A's details
}

函数 A 和 B 定义接口,向用户提供有关可接受参数的提示,而无需将构造函数与类定义联系起来,并执行初步数据处理。后者可以使initialize不必要的方法,这是一件好事,因为这些方法有一个复杂的合同 https://stackoverflow.com/questions/16247583/inheritance-in-r/16248773#16248773(他们应该初始化and是复制构造函数,正如我们在上面看到的,未命名参数应该初始化基类),但大多数人都错了。

大多数情况下,这些只是我的意见。

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

如何为继承的槽定义 S4 原型 的相关文章

  • 如何更改 ESS 中的智能分配键(“_”到“<-”)绑定

    在 emacs ESS 中 如何正确更改 ess smart S assign 的键绑定 我尝试的是添加 custom set variables ess smart S assign key to my emacs 但这让奇怪的事情发生了
  • aggregate() 将多个输出列放入矩阵中

    我要计算某个变量的多个分位数 gt res1 lt aggregate airquality Wind list airquality Month function x quantile x c 0 9 0 95 0 975 gt head
  • 如何在Shiny中引用ui.R中的反应元素

    我正在使用 ShinyDND 包制作一个具有拖放功能的应用程序 我想将输入中的列表作为 DragSetUI 的参数传递 该函数需要在 ui R 中运行 我尝试了renderUI和uiOutput 它几乎可以工作 但是拖动的元素无法放置在放置
  • ggplot 中的分层轴?

    我想知道是否可以在 GGLPOT2 或其他图形包 我只是更喜欢 ggplot 中制作分层 分段轴 我想要做的是获取下面的数据 制作一个堆积条形图 其中 x 轴上有周期 但在每个周期内 还有每种动物 那么每只动物内的条形颜色将是 颜色 变量
  • 查找表中第三个四分位数以上的频率

    我有一个大数据框架 对 57 个变量的超过 239k 观察值 其中包含一些疾病描述以及针对不同年龄段的人针对这些疾病使用的药物 我想在每种疾病描述的使用频率前四分之一中找到这些药物 为了制作一个可重现的示例 我创建了一个包含 1000 个观
  • 加载 plyr 包时出现问题

    我使用 R 2 13 1 但未能成功尝试在 R 中加载包 plyr 1 6 我已将其手动安装到目录 R library 中 我的代码是 libPaths R library library plyr 我收到消息 库 plyr 中的错误 pl
  • 在 R/exams exams2nops() 中用零填充初始学生 ID

    当使用exams为 NOPS 考试生成 PDF 文件的软件包我想编辑学生可用的位数 reglength 我知道该软件包只允许至少 7 位数字 然而 我们学生的身份证号码只有5位数字 因此我想知道是否可以通过 PDF 操作来编辑模板 我尝试过
  • 匹配字符串在多列上循环

    我有来自一项开放式调查的数据 我有一个注释表和一个代码表 代码表是一组主题或字符串 我正在尝试做的事情 检查代码表中相关列中是否存在开放式注释中的单词 字符串 在评论表中为特定主题添加一个新列 并添加一个二进制 1 或 0 来表示已标记哪些
  • R Shiny 中表格的条件格式

    我正在尝试可视化队列分析 并想使用RenderDataTable闪亮以获得这种可视化效果 我将能够突出显示基于具有值 1 0 的单独列的所有单元格 其中 1 被着色 0 不被着色 我尝试了几件事 包括尝试使用geom tile in ggp
  • Rshinyjsshinydashboard框在radionButtons输入上展开

    基于这个问题Rshinyjsshinydashboard框在操作按钮输入时展开 https stackoverflow com questions 49659804 r shinyjs shinydashboard box uncollap
  • 如何禁用“保存工作区图像?” R 中的提示?

    当我退出交互式 R shell 时 它每次都会显示一个烦人的提示 gt gt Save workspace image y n c n 我总是对此回答 不 因为如果我想保存我的工作 我就会这么做before试图退出 如何去掉这个提示呢 No
  • 如何使用类在 PowerShell 中实现事件处理

    我希望能够创建一个自定义事件 该事件将触发订阅该事件的函数或对象 我查看了一些功能 例如 New Event and Register ObjectEvent 但我不完全确定如何有效地将它们组合在一起 我想要的想法是让一个函数在引发某个事件
  • 使用 != 子集 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 - 根据第一个向量重新排序第二个向量

    寻找解决方案来执行以下操作 有两个向量 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 在这种情况下我想得到
  • 难以理解 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
  • 替换因子列中的

    我想更换
  • 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 值的系数值 我现在需要的是变量选择
  • 闪亮的本地部署错误:输入字符串 1 无效 UTF-8

    我很惊讶地发现一个突然的错误 我的 ShinyApp 停止工作并出现未知错误 提示 输入字符串 1 无效 UTF 8 即使在昨天 该应用程序也可以正常运行 但是突然停止了 下面是我运行时的错误描述runApp gt runApp Liste

随机推荐

  • 将向量列表转换为数据框

    我正在尝试将向量列表 本质上是多维数组 转换为数据框 但每次尝试都会得到意想不到的结果 我的目标是实例化一个空白列表 用包含有关该循环迭代的信息的向量将其填充到 for 循环中 然后在完成后将其转换为数据帧 gt vectorList lt
  • Android画布路径实时表现

    我想在 15 分钟内绘制 4 或 5 个 实时图表 可视化大量数据 每 30 毫秒一个新值 我正在使用 Path 但当我想要显示超过 20000 个值并平移画布时 它似乎工作得非常慢 并且每秒都变得更糟 我也尝试过使用drawLine 但它
  • “Impact”字体在移动 Chrome 上不起作用

    我已经与 Impact 字体斗争了大约一年了 它应该是一种网络安全字体 但事实并非如此 当我使用标准 Impact 时 它无法在移动平台上运行 如果我使用特定的字体 font face 则不可能在 PC 和 Mac 上获得相同的渲染效果 我
  • 无法迭代二维数组来标准化数据

    我正在尝试标准化我的数据 并且需要迭代训练和测试集 我尝试了不同的方法 但出现此错误list indices must be integers or slices not list 我试过把range and len 但我仍然遇到同样的错误
  • 接口类纯虚信号的连接

    我想连接从接口类派生的某些对象的信号 连接完成于QWidget listenToAnimal AnimalInterface 这不起作用 因为qt metacall is not a member of AnimalInterface an
  • Elasticsearch:嵌套对象的批量更新

    我的文档结构如下 documentID 123 originalFilename Build a Better Post pdf modDate 2017 11 16T18 22 54 48 documentType pdf keySyst
  • Visual Studio 复制项目

    我想复制我的项目 我宁愿不通过添加文件和引用等从头开始执行此操作 请注意 我并不是指复制部署 只是简单的复制 VS中有没有工具可以做到这一点 我用的是VS 2008 Just 从您的项目中选择 项目 导出模板 向导将让您定义 模板名称 模板
  • Dask:定期更新已发布的数据集并从其他客户端提取数据

    我想将数据附加到published dask dataset来自队列 如 redis 然后其他 python 程序将能够获取最新数据 例如每秒 分钟一次 并执行一些进一步的操作 这可能吗 应该使用哪个附加接口 我应该将它加载到pd Data
  • cx_Freeze - 从桌面快捷方式运行 .exe 时出错

    我的 Pygame 应用程序可以完美运行 exe编译后的文件msi在 cx Freeze 中 但是当我从桌面快捷方式运行它时 出现错误 快捷方式目标是正确的 声音文件都在正确的目录中 我都尝试过 wav and ogg文件并降低了比特率等
  • 表达式类型“@lvalue String?”没有更多上下文就含糊不清

    无缘无故地我得到了这个错误表达式类型 lvalue String 没有更多上下文就含糊不清在我的代码中 if textView text takenImage nil userLocation text checkInternet Crea
  • Chrome 信用卡到期自动填充格式

    我在我帮助维护的网站上有一张信用卡登记表 后端编码为采用 MM YY 格式的 2 位数到期月份和 2 位数年份 Chrome 似乎设置为以 MM YYYY 格式应用信用卡信息 因此如果用户存储的 CC 过期日期为 05 2023 它将自动填
  • 由于 getValue 和单元格插入,处理时间可能较长

    我刚刚编写了我的第一个 google apps 脚本 该脚本是从 VBA 移植的 它格式化了一列客户订单信息 感谢您的指导 描述 该代码通过其 前缀来标识州代码 然后将以下名字与姓氏 如果存在 组合起来 然后 它会在姓氏所在的位置写入 订单
  • 如何在WKWebView上加载URL?

    我正在尝试在包含 CSV 文件的 WKWebView 上加载 URL 当我尝试正常加载时 它给了我一个错误 文件格式不受支持 可能已损坏 即使移动 safari 也给我同样的错误 然后我尝试使用 MIME 类型与 WKWebView 的以下
  • 如何使用访问控制允许来源?它只是放在 html head 标签之间吗?

    我一直在读关于Access Control Allow Origin因为它似乎可以有效地允许跨域请求 因为我可以访问外部站点 我的问题是我该如何使用Access Control Allow Origin允许跨域请求 我尝试过这个 别笑 顺便
  • 如何在树枝模板中的变量之间添加空格?

    这是一个非常简单的问题 但我还没有找到答案 这段代码 civilite nom prenom 打印 MRJOHSONBarry 我想在变量之间添加空格 我该怎么做 如果 Civilite nom prenom 不起作用 怎么样 civili
  • 我不断收到类型错误

    好吧 我正在自学 python 类 当我运行代码时 出现以下错误 class Critter object A virtual pet def init self name mood print A new critter has been
  • 使用批处理文件在 Windows 中生成 GUID

    如何在 Windows 中使用命令行运行的批处理文件中生成 GUID Windows SDK 附带了一个名为uuidgen 如果您有 Visual Studio 您将拥有 Windows SDK 并且需要运行Visual Studio 命令
  • WPF - 从 ItemsControl 的 ItemTemplate 内绑定到项目索引?

    有没有办法从 ItemsControl 的 ItemTemplate 中绑定到 ItemIndex 例如
  • 向 Ruby 数组添加回调函数,以便在添加元素时执行某些操作

    我想向 Ruby 数组添加回调函数之类的东西 这样当将元素添加到该数组时 就会调用该函数 我能想到的一件事是重写所有方法 如 有更简单的解决方案吗 以下代码仅调用size changed当数组大小发生更改并且传递数组的新大小时挂钩 a cl
  • 如何为继承的槽定义 S4 原型

    我有一个基类 我们称之为 A 其表示对于许多其他类来说是通用的 因此我定义了其他类 例如 B 来包含这个类 我想设置这些其他类 B 的原型以包含从 A 继承的插槽的默认值 我认为这是很自然的 setClass A representatio