2

首先一点上下文:

在我的包summarytools中,我print为“summarytools”类的对象定义了一个方法。我还创建了一个函数,该函数view()处理使用by()lapply()以这样的方式创建的对象,即输出不包括说明组的行 - 或在 ; 的情况下的变量lapply()。summarytools 显示包含该信息的自己的标题,因此在使用print. 此外,使用view().

这是一个例子。请注意,在此版本(开发中)中,我包含了一条建议使用的消息view()

> library(summarytools)
> (tmp <- with(tobacco, by(smoker, gender, freq)))
gender: F
For best results printing list objects with summarytools, use view(x, method = 'pander')
Frequencies   
tobacco$smoker     
Type: Factor    
Group: gender = M   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
        Yes    147     30.06          30.06     30.06          30.06
         No    342     69.94         100.00     69.94         100.00
       <NA>      0                               0.00         100.00
      Total    489    100.00         100.00    100.00         100.00
------------------------------------------------------------------ 
gender: M
Frequencies   
tobacco$smoker     
Type: Factor    
Group: gender = F   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
        Yes    143     29.24          29.24     29.24          29.24
         No    346     70.76         100.00     70.76         100.00
       <NA>      0                               0.00         100.00
      Total    489    100.00         100.00    100.00         100.00

现在使用view()

> view(tmp, method = "pander")
Frequencies   
tobacco$smoker     
Type: Factor    
Group: gender = M   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
        Yes    147     30.06          30.06     30.06          30.06
         No    342     69.94         100.00     69.94         100.00
       <NA>      0                               0.00         100.00
      Total    489    100.00         100.00    100.00         100.00

Group: gender = F   

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
        Yes    143     29.24          29.24     29.24          29.24
         No    346     70.76         100.00     70.76         100.00
       <NA>      0                               0.00         100.00
      Total    489    100.00         100.00    100.00         100.00

我已经考虑过如何将“by”类的对象自动分派到view()而不是print(). 如果我将“summarytools”类添加到这些对象,该print()方法可以将调用重定向到view(),从而使用户更容易获得正确的最佳输出。

到目前为止,我想到的解决方案如下:

  1. 向函数添加“by”参数,以便我可以完全控制创建对象的比例。我不喜欢这个解决方案,因为 1)我尝试依赖人们熟悉的基本 R 函数,而不是引入新参数,2)当使用lapply().
  2. 重新定义by(),以便在从 summarytools 的函数之一调用它时,它将所需的类附加到创建的对象中。我避免了这种情况,因为我对重新定义基本函数犹豫不决。我宁愿看不到在加载包时对象已被屏蔽的消息。
  3. 定义一个特定的包by(),例如by_st(); by.default()我可以使用与and基本相同的代码by.data.frame(),唯一的区别是我将“summarytools”类添加到创建的对象中。这是我正在考虑的一种妥协。

我的问题如下:是否还有其他我没有看到的更好的解决方案?

4

1 回答 1

3

您可以使用 S3 方法print.by来调度您的自定义函数:

old.print.by = print.by # save the original function so we can restore it later
print.by = summarytools::view # redefine print.by to dispatch to custom function
tmp

在此处输入图像描述

以后要恢复原来的功能,你可以这样做print.by = old.print.by

如果您只希望新函数对包含“summarytools”类对象的列表进行操作,则可以使用

print.by = function(x, method = 'pander', ...) {
  if ("summarytools" %in% class(x[[1]])) {
    summarytools::view(x, method, ...)
  } else {
    old.print.by(x, ...)
  }
}
于 2018-12-27T00:28:47.063 回答