How to examine the code of a function in R that's object class sensitive

后端 未结 5 664
南笙
南笙 2020-12-07 15:35

I\'m trying to write a function to do a particular job (in my case, analyse a data set for outliers) so the first things I want to do is look at how other people have done s

相关标签:
5条回答
  • 2020-12-07 15:39

    When you say

    the function did do other things depending on the class of the object thrown at it

    you are already at the heart of the S3 dispatch mechanism! So I would recommend reading a programming book on R as e.g.

    • (classic but dated) Venables/Ripley "S Programming",
    • Gentleman "Bioinformatics with R",
    • Brown/Murdoch "First Course in Statistical Programming with R",
    • Chambers "Software for Data Analysis: Programming with R",

    or other resources from this SO question on R books along with an example package or two from the rich set of CRAN packages.

    0 讨论(0)
  • 2020-12-07 15:43

    My thought process for finding function code tends to be:

    First, type the name of the function

    Case 1: It shows the code

    Great, you're done.

    Example: diag

    Case 2: The function comes up as a one line UseMethod statement

    You have an S3 method. Type methods(fnname) to see available methods, then getAnywhere(fnname.myclass).

    Example: mean

    methods(mean)
    getAnywhere(mean.default)
    
    Case 3: The function contains a .Internal or .Primitive statement

    The function is written in C, for improved performance. Download a copy of the R source code and extract the tarball. Search in the src directory for the function name.

    EDIT: You can also search for the file using Google or Yahoo site search.

    site:https://svn.r-project.org/R/trunk/src functionname
    

    End EDIT

    Example: qnorm

    A simple windows search for "qnorm" in the src directory of the R source code reveals the file qnorm.c, which contains the function definition.

    EDIT: qnorm.c is also the top result from the search

    site:https://svn.r-project.org/R/trunk/src qnorm
    

    End EDIT

    Case 4: Still can't find the function

    It's probably a method of an S4 class.

    Type class(myobj) to find the class.

    Type showMethods(class="myclass") to find available methods for that class.

    Type getMethods("fnname", "myclass").

    Example: plot pixmap

    This requires the pixmap package.

    library(pixmap)
    pixie <- pixmap(1:12, nrow=3, ncol=4)
    class(pixie)   #"pixmap"
    showMethods(class="pixmap")
    getMethod("plot", "pixmap")
    
    0 讨论(0)
  • 2020-12-07 15:43

    For example, plot() will do different things depending on the object. You can see the specific plot functions (called methods) using plot.ts(), plot.lm(), etc. i.e., plot() will call plot.ts() if a ts object is passed. In general, plot.xxx() is applied to objects of class xxx. If there is no specific method for the class, then plot.default() is used.

    The function plot() is called a generic function because it can apply to many different classes. Other common generic functions are summary(), print() and predict().

    As Dirk says, it is well worth reading the documentation on S3 methods and classes.

    0 讨论(0)
  • 2020-12-07 15:50

    I recently stumbled across the CRAN Meta repository on GitHub, which basically holds a read-only version of all packages in the CRAN repository. You can search by package name, after selecting the package you'Re after there is a folder called R within, which houses the source code in R.

    For example, I searched for the package mboost, clicked on the in and entered the R folder, which shows this list of code.

    I haven't had a case yet where I couldn't find what I was after. I also haven't got as far as to see if ALL underlying C/C++ code is shown or linked, but it was for the mboost example above. The c-code was in another top-level folder named src

    0 讨论(0)
  • 2020-12-07 16:04

    For another case not covered in the answers here see the answers reported in "view source code in R"

    which deals with the case of functions that show up as "Non-visible" when you run methods(function.I.am.looking.for)

    In short you can then use a command of the form: package:::function.class to see the code you want.

    0 讨论(0)
提交回复
热议问题