r 如何保留自定义类的打印方法

2023-12-31

我已经定义了一种使用类测试打印向量的方法:

print.test <- function(x,  ...) {
    x <- formatC(
        as.numeric(x),
        format = "f",
        big.mark = ".",
        decimal.mark = ",",
        digits = 1
        )
    x[x == "NA"] <- "-"
    x[x == "NaN"] <- "-"
    print.default(x)
}

这适用于以下情况

a <- c(1000.11, 2000.22, 3000.33)
class(a) <- c("test", class(a))
print(a)
[1] "1.000,11" "2.000,22" "3.000,33"

这也有效:

round(a)
[1] "1.000,0" "2.000,0" "3.000,0"

这不会:

median(a)
[1] 2000.22
class(median(a))
[1] "numeric"

现在我的问题是:我是否需要为此类编写一个自定义方法来使用中位数,例如如果是这样,它会是什么样子或者有其他方法(因为我只是希望这个类以某种格式打印数据)?


问题是median.default返回一个类的对象numeric因此返回对象的自动打印不会调用您的自定义print method.
下面将这样做。

median.test <- function(x, na.rm = FALSE, ...){
    y <- NextMethod(x, na.rm = na.rm, ...)
    class(y) <- c("test", class(y))
    y
}

median(a)
#[1] "2.000,2"

至于处理NA值,我将首先为基本 R 函数定义另一种方法。这不是严格需要的,但如果类的对象可以节省一些代码行test经常使用。

c.test <- function(x, ...){
    y <- NextMethod(x, ...)
    class(y) <- c("test", class(y))
    y
}


b <- c(a, NA)
class(b)
#[1] "test"    "numeric"

median(b)
#[1] "-"

median(b, na.rm = TRUE)
#[1] "2.000,2"

EDIT.

下面定义了一个通用函数wMedian,默认方法和类对象的方法"currency",按照OP在评论中的要求。

注意一定要有一个方法print.currency,我没有重新定义,因为它与print.test多于。至于其他方法,我借助一个新函数使它们变得更简单,as.currency.

median.currency <- function(x, na.rm = FALSE, ...){
  y <- NextMethod(x, na.rm = na.rm, ...)
  as.currency(y)
}

c.currency <- function(x, ...){
  y <- NextMethod(x, ...)
  as.currency(y)
}

as.currency <- function(x){
  class(x) <- c("currency", class(x))
  x
}

wMedian <- function(x, ...) UseMethod("wMedian")
wMedian.default <- function(x, ...){
    matrixStats::weightedMedian(x, ...)
}

wMedian.currency <- function(x, w = NULL, idxs = NULL, na.rm = FALSE, interpolate = is.null(ties), ties = NULL, ...) {
  y <- NextMethod(x, w = w, idxs = idxs, na.rm = na.rm, interpolate = interpolate, ties = ties, ... ) 
  as.currency(y)
}


set.seed(1)
x <- rnorm(10)
wMedian(x, w = (1:10)/10)
#[1] 0.4084684
wMedian(as.currency(x), w = (1:10)/10)
#[1] "0,4"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

r 如何保留自定义类的打印方法 的相关文章

  • 如何调整ggplot直方图的时间刻度轴

    我正在使用一个数据框 其中一列包含POSIXct日期时间值 我正在尝试使用绘制这些时间戳的直方图ggplot2但我有两个问题 我不知道如何设置 binwidthgeom histogram 我想将每个垃圾箱设置为一天或一周 我尝试提供 di
  • R从列表中提取数据框,列名中没有前缀

    我在列表中放置了一个数据框 然后 当尝试将其提取回来时 我得到了该数据帧的所有以列表键为前缀的列名称 有没有办法完全按照最初传递的方式提取数据帧 cols lt c column1 Column2 Column3 df1 lt data f
  • 将summary()写入as.data.frame以在ggplot / R中使用

    请查找 af 数据样本t below 我正在使用以下方法进行竞争风险分析etmCIF来自etm package 产生以下结果 这很好 但需要更好的图形 曾经有一个ggtrans etm函数将数据导入ggplot 然而 这个功能显然被删除了
  • R read_excel:libxls 错误:无法解析文件

    我试图使用 readxl read excel 将 xls 文件读入 R 但它给出了以下错误 Error filepath data xls libxls error Unable to parse file 还尝试了 readxl exc
  • 用于清除工作空间和转储存储的 R 全局函数

    我希望创建一个全局函数来清除我的工作区并转储我的内存 我将我的函数称为 cleaner 并希望它执行以下代码 remove list ls gc 我尝试在全局环境中创建该函数 但是当我运行它时 控制台仅打印该函数的文本 在我要获取的函数文件
  • 将值替换为其各自列的名称

    我有一个数据框 Code 401k CVS 101A true 231N true FD54 true 99JB 85F4 true 我试图用相应的列名称 例如 401k 替换 true 字符值 这是我想要的输出 Code 401k CVS
  • 如何在不循环的情况下添加组ID?

    我有数据框 例如 productid ordernum p1 10 p2 20 p3 30 p4 5 p5 20 p6 8 我想添加另一列 称为 groupid 它将产品按顺序分组在一起 一旦 sum ordernum 达到 30 分配一个
  • 将列表中的列转换为 R 中的数据框

    我有使用 R 创建的以下列表 set seed 326581 X1 rnorm 10 0 1 Y1 rnorm 10 0 2 data data frame X1 Y1 lst lt replicate 100 df smpl lt dat
  • 查找数据帧列表中同一列中的所有重复值并将其转换为 NULL

    我有一个清单BELGIAN COAST list包含数百个数据帧 df1 df2 15 列 X 1000 行 每个数据帧的最后一列称为Chemicals并包含一些字符 例如Sulfate or Ammonia 但是这一列有很多行Chemic
  • Python Selenium 打印另存为 PDF 等待文件名输入

    我正在尝试通过打印对话框将网站另存为 PDF 我的代码允许我另存为pdf 但要求我输入文件名 我不知道如何将文件名传递到弹出框 附上我的代码 import time from selenium import webdriver import
  • 限制数据框中所有单元格的字符串长度?

    您好 有没有一种方法可以限制 data frame 中所有列的字符串文本大小 而不必循环遍历每一列并一次使用 str trunc 之类的东西 例如下面的数据框 我可以将所有文本大小限制为仅 5 个字符 而不必一次只执行一列吗 如果有 50
  • 将 VLMC 拟合到很长的序列

    我正在尝试将 VLMC 拟合到最长序列为 296 个状态的数据集 我这样做如下所示 Load libraries library PST library RCurl library TraMineR Load and transform d
  • 将函数应用于 3d 数组的每一层,返回一个数组

    假设您有一个包含行 列和层的 3 维数组 A lt array 1 27 c 3 3 3 想象你有一个函数 它接受一个矩阵作为输入并返回一个矩阵作为输出 就像t 如何将该函数应用于数组的每一层 返回与第一层大小相同的另一个数组 我觉得我应该
  • 在 php 中为类自动生成 getter 和 setter 的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常创建一个包含一些私有变量的类 当设置此类的实例时 应该可以使用 getter 和 setter 填充该类的所有变量 有没有一种简单的方法可
  • 仅保留百分比的尾随零

    给出以下示例 library pander tableAbs lt Titanic 1 1 tablePct lt round prop table tableAbs 100 2 table lt cbind tableAbs tableP
  • glmnet 未从 cv.glmnet 收敛 lambda.min

    我跑了20倍cv glmnet套索模型以获得 lambda 的 最佳 值 但是 当我尝试重现结果时glmnet 我收到一个错误 内容如下 Warning messages 1 from glmnet Fortran code error c
  • 使用outer代替expand.grid

    我正在寻找尽可能快的速度并留在基地做该做的事expand grid做 我用过outer为过去类似的目的创建一个向量 像这样的东西 v lt outer letters LETTERS paste0 unlist v lower tri v
  • 带 R 的多彩标题

    我想添加颜色某些词在我的图表标题中 我已经能够在这里找到一些先例 http blog revolutionanalytics com 2009 01 multicolor text in r html 具体来说 我希望用撇号括起来的文本 在
  • 如何匹配 R 中的所有匹配项?

    我有 1000 个名字的列表 说A 我还有另外 5 个名字的清单 说B 我想找出这5个名字出现在1000个号码列表中的第几行 例如 Amy 在 A 中可以出现 25 次 B 里有艾米 我想知道 Amy 出现在 A 中的哪些行 我以前使用过
  • 单击 R 中的 Sankey Chart 线时添加额外的标签值

    以下 R 闪亮脚本创建一个桑基图 如下面的快照所示 我的要求是 当我单击左右节点之间的任何链接 即 a1 和 a2 时 我希望相应的 a3 的总和出现在标签中 例如 a1 中的 A 和 a2 中的 E 总共具有值 50 和 32 因此 我想

随机推荐

  • br 标签在 Haml on Rails 3 中未关闭

    我在让 Haml 关闭 br 标签时遇到问题 我尝试了以下方法但没有成功 br br 我预计这会导致 br 但它总是输出为 br 即使末尾有斜线字符 我还尝试将以下选项添加到 application rb 并且我尝试了environment
  • 用于检查 4 个不同字符组中至少存在 3 个的正则表达式

    我正在尝试编写一个密码验证器 如何查看我提供的字符串是否包含至少 3 个不同的字符组 检查它们是否存在很容易 但至少有 3 个 至少八 8 个字符 至少三个不同的角色组 大写字母 小写字母 numeric 特殊字符 我正在使用 javasc
  • 在 jquery post 中发送长字符串

    我无法在 jquery post 方法中发送长字符串 超过 96 个字符 在 FF12 和 Chrome 18 中测试 我的 servlet 是 public class TestServletAsh extends HttpServlet
  • SoftLayer API 用于了解 VLAN 中的总 IP 和可用 IP

    SoftLayer API 用于了解 VLAN 中的总 IP 和可用 IP Hello 如果我知道某个 VLAN 的总 IP 数和已用 可用 IP 可以使用哪个 APIVLAN ID 我能想到的一种方法是我可以获得 VLAN 的子网 然后在
  • (Python) ValueError:在路径中找不到程序点

    我有以下问题 我在 xUbuntu 操作系统上 我尝试在 Flask 应用程序中使用 networkx 并且我有以下代码 import networkx as nx Creating and initializing graph objec
  • ASP.NET MVC C#:查看记录详细信息时出现对象引用错误

    我是一个 NET 和 MVC 新手 在经历了 ASP 的长时间使用之后 我第一次学习它 现在是时候进行转换 让我构建 Web 应用程序的工作变得更加容易 我一直在浏览 Stephen Walther 的有用视频教程来了解大多数事情 到目前为
  • ICC 汇编输出中的所有这些数字意味着什么?

    使用 ICC 编译时 每条指令后面都是 2 个点分隔的数字 并以哈希符号为前缀 这意味着什么 例如 https gcc godbolt org g g g h codeEditor i j 1 source int testFunction
  • :nth-child(n+4):nth-child(-n+8) 如何选择一系列元素?

    根据http nthmaster com http nthmaster com 当通过 nth child 设置一系列元素的样式时 我们必须这样做 nth child n 4 nth child n 8 如果我们只使用一个 nth chil
  • 自动宽度和 100% 宽度之间的差异

    之前我的假设是width auto宽度设置为内容的宽度 现在我看到它占据了父级的整个宽度 谁能描述一下它们之间的区别吗 宽度自动 像 div 或 p 这样的块级元素的初始宽度是 auto 这使得它扩展以占据其包含块内的所有可用水平空间 如果
  • PHP函数返回NULL而不是数组[重复]

    这个问题在这里已经有答案了 我调用一个执行一些递归并且应该返回一个数组的函数 事实上 被调用函数中 return 语句之前的 var dump 就表明了该数组 然而 调用函数结果的 var dump 显示 NULL 而不是数组 这是调用函数
  • 从 Ruby、PHP 或 Cocoa 访问 Mac 应用程序

    我想通过 Ruby 访问几个不同的 Mac OS X 应用程序 但我会选择 PHP 这些应用程序是Elgato 的turbo 264 和Apple 的iTunes 两者都定义了 Applescript 库 允许我从 Applescript
  • 假冒带有 body 的 get 请求

    由于某种原因 我需要调用 GET 方法 API 并为其传递 json 请求正文 我实在找不到这样的例子 我想知道是否支持使用 feign 我怎样才能使用 feign 做到这一点 是的 Feign 支持它 您可以执行与 POST 请求相同的操
  • 在 10.9 上编译 Swift?

    直到今天下午 当我下载最终版 Xcode 6 时 我才能够在我的 10 9 机器上使用 Swift 现在我得到这个错误 OS X targets using Swift cannot be built against an SDK olde
  • 如何在 WebSphere 中管理 ClassPath

    我的 Websphere v6 1 中的 Web 模块类路径有问题 在我的 WEB INF lib 中 我有大量的 jar 文件 其中包括 xercesImpl jar 和 xmlparserv2 jar 我需要两个罐子都存在 但它们似乎相
  • 在 oracle 12 中搜索逗号分隔值

    我有一张桌子 Product在Oracle中 其中p spc cat id存储为逗号分隔值 p id p name p desc p spc cat id 1 AA AAAA 26 119 27 15 18 2 BB BBBB 0 0 27
  • 如何使用MongoDB聚合进行分页?

    我想执行一个进行基本分页的聚合查询 查找属于某个特定的所有订单company id 订单排序依据order number 统计文档总数 跳至例如文件号码100并传递其余的 将文档数量限制为例如2并将它们传递下去 最后返回计数和文档中选定的几
  • JavaScript Alert() 函数中的单引号转义

    我正在展示一些法语台词javascript alert function法国线看起来像 S il vous pla t accepter les termes et conditions avant de proc der 警报看起来像页面
  • 与 Intel 的 xchgl 等效的 ARM 指令是什么?

    I found LDREX and STREX可能是要使用的 但他们是two指令 因此不提供原子性xchgl 我想要原子交换的值是一个 32 位值 能LDREX and STREX以提供 32 位值的原子交换的方式使用 或者它们是实现它的其
  • 如何在 C 中打印日期?

    我正在尝试从 01 01 01 之类的字符串中打印日期 并得到 2001 年 1 月 1 日星期一 之类的内容 我在 ctime 的 man 中找到了一些东西 但真的不知道如何使用它 有什么帮助吗 Thanks 您可以使用strptime将
  • r 如何保留自定义类的打印方法

    我已经定义了一种使用类测试打印向量的方法 print test lt function x x lt formatC as numeric x format f big mark decimal mark digits 1 x x NA l