【问题标题】:How customize a plot inside a R function which belong to a package?如何在属于包的 R 函数中自定义绘图?
【发布时间】:2019-11-26 23:28:20
【问题描述】:

我正在准备一个小型 r 包,我想在通过函数创建的对象上使用函数 plot(),并获得自定义图。例如,这是一个非常愚蠢的示例函数:

myfun <- function(x,y){

A <- B <- c()

  for(i in 1:x) {
    A[i] <- i^2
    B[i] <- i^2+1}

  return(list(A,B))
}

然后,我创建一个包含 2 个向量的列表:

obj <- myfun(5,6)

因此,获取绘图的标准方法是:

plot(x=obj[[1]],y=obj[[2]], main='my title',type = 'b', col='red)

但是,我想运行以下命令:

plot(obj)

并得到同样的结果。所以我不知道如何将它编码到我的函数中以获得完全个性化的情节。另外,我想获得一个自定义的汇总表,例如,运行以下内容:

summary(obj)

能够得到一张带有means、sd等的表格。 我在 StackOverflow 上到处找这个,但没有成功,但也许我使用了错误的关键字。提前非常感谢。

【问题讨论】:

  • 您必须添加一个 S3 方法来绘制...例如plot.your_class &lt;- function(your_dat){plot(x=obj[[1]],y=obj[[2]], main='my title',type = 'b', col='red)} 重要的是,您还需要为输出对象分配一个新类。见 adv-r.had.co.nz/S3.html>

标签: r plot package cran


【解决方案1】:

如果你给你的 myfun 输出一个自定义类:

class(obj) <- 'myClass'

然后添加一个新的s3方法:

plot.myClass <- function(obj) {
      plot(x=obj[[1]],y=obj[[2]], main='my title',type = 'b', col='red)
}

现在你可以使用了:

plot(obj)

【讨论】:

    【解决方案2】:

    您需要定义一个类,然后创建您自己的个人方法。

    plot()summary() 是通用函数。如果您在控制台上输入:

    methods(plot)
    methods(summary)
    

    你会看到很多方法已经存在。

    如果您在控制台上打印plot,您会看到:

     plot
     #> function (x, y, ...) 
     #> UseMethod("plot")
     #> <bytecode: 0x2363df0>
     #> <environment: namespace:graphics>
    

    plot 调用一个名为UseMethod 的函数,该函数将查找与plot 相关的命名空间和全局环境中的所有可用方法。

    以这种方式编辑您的代码:

    myfun <- function(x,y){
    
      A <- B <- c()
    
      for(i in 1:x) {
          A[i] <- i^2
          B[i] <- i^2+1}
    
      structure(class = "myclass", list(A,B))
    
      }
    

    这样你就可以创建你的类了。您的函数myfun() 将始终返回一个对象myclass,它是两个数字向量的列表。

    现在您可以创建自己的方法。方法应以与泛型函数相同的名称开头,后跟一个点和您的类的名称。

    plot.myclass <- function(obj, ...){
        plot(x = obj[[1]], y = obj[[2]], main='my title', type = 'b', col = 'red', ...)
    }
    
    obj <- myfun(5,6)
    plot(obj)
    

    添加...,以防您将来想为您的情节添加更多功能。

    summary 的内容相同。例如,您可以对 print 进行相同的操作。

    PS:我强烈建议您在示例中使用lapply()vapply()purrr::map_dbl() 而不是for 循环。 并选择整洁的ggplot 而不是情节。

    【讨论】:

      【解决方案3】:

      SmokeyShakers 关于绘图的答案是正确的,但是对于您的其他问题,关于能够获得带有均值、sd 等的表格的问题。 您需要将您的 obj 转换为数据框,然后运行摘要,以便能够获得所有这些统计信息。

      summary(data.frame(x=obj[[1]],y=obj[[2]]))
      
             x            y     
       Min.   : 1   Min.   : 2  
       1st Qu.: 4   1st Qu.: 5  
       Median : 9   Median :10  
       Mean   :11   Mean   :12  
       3rd Qu.:16   3rd Qu.:17  
       Max.   :25   Max.   :26  
      

      编辑:或者为了保持一致,您可以执行以下操作:

      summary.myClass <- function(obj){summary(data.frame(x=obj[[1]],y=obj[[2]]))}
      summary(obj)
      

      【讨论】:

      • 或者同样,制作自己的方法:summary.myClass
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 2021-06-22
      相关资源
      最近更新 更多