Как проверить код функции в R, чувствительный к классу объектов

Я пытаюсь написать функцию для выполнения определенной работы (в моем случае, проанализировать набор данных для выбросов), поэтому первая вещь, которую я хочу сделать, - это посмотреть, как другие люди выполняли аналогичные задания.

Я могу сделать это, чтобы загрузить конкретный пакет и изучить код функции, но некоторые функции, похоже, зависят от того, какой класс объекта вы бросаете на него

>library(outliers)
> fix(outlier)

function (x, opposite = FALSE, logical = FALSE) 
{
    if (is.matrix(x)) 
        apply(x, 2, outlier, opposite = opposite, logical = logical)
    else if (is.data.frame(x)) 
        sapply(x, outlier, opposite = opposite, logical = logical)
    else {
        if (xor(((max(x) - mean(x)) < (mean(x) - min(x))), opposite)) {
            if (!logical) 
                min(x)
            else x == min(x)
        }
        else {
            if (!logical) 
                max(x)
            else x == max(x)
        }
    }
}

Как вы можете смотреть на код чего-то, что изменяется в зависимости от объекта?

Edit:

ОК, Palm < - face. Функция, которую я использовал в качестве примера, просто вызывает себя, но все, что у него есть код... Я видел другие примеры (но не могу придумать ничего из себя), где функция выполняла другие вещи в зависимости от класса объекта, брошенного на этом, так что вопрос стоит, хотя это плохой пример!

Ответ 1

Когда вы говорите

функция делала другие вещи в зависимости от класса объекта брошенный на него

вы уже находитесь в центре механизма отправки S3! Так Я бы рекомендовал прочитать книгу программирования на R, например.

  • (классический, но датированный) Venables/Ripley "S Programming",
  • Джентльмен "Биоинформатика с R",
  • Браун/Мердок "Первый курс статистического программирования с R",
  • Chambers "Программное обеспечение для анализа данных: программирование с R",

или другие ресурсы из этого SO-запроса на R-книги вместе с примером пакета или двух из богатого набора пакетов CRAN.

Ответ 2

Мой мыслительный процесс для поиска кода функции имеет тенденцию быть:

Сначала введите имя функции

Случай 1: он показывает код

Отлично, все готово.

Пример: diag

Случай 2: функция вызывается как однострочное выражение UseMethod

У вас есть метод S3. Введите methods(fnname), чтобы просмотреть доступные методы, то getAnywhere(fnname.myclass).

Пример: средний

methods(mean)
getAnywhere(mean.default)
Случай 3: Функция содержит .Internal или .Primitive statement

Функция написана на C для повышения производительности. Загрузите копию исходного кода R и извлеките архив. Найдите в каталоге src имя функции.

РЕДАКТИРОВАТЬ: Вы также можете искать файл с помощью поиска в Google или Yahoo.

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

End EDIT

Пример: qnorm

Простой поиск по окну "qnorm" в каталоге src исходного кода R показывает файл qnorm.c, который содержит определение функции.

EDIT: qnorm.c также является верхним результатом поиска

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

End EDIT

Случай 4: все еще не удается найти функцию

Вероятно, это метод класса S4.

Введите class(myobj), чтобы найти класс.

Введите showMethods(class="myclass"), чтобы найти доступные методы для этого класса.

Введите getMethods("fnname", "myclass").

Пример: plot pixmap

Для этого требуется пакет pixmap.

library(pixmap)
pixie <- pixmap(1:12, nrow=3, ncol=4)
class(pixie)   #"pixmap"
showMethods(class="pixmap")
getMethod("plot", "pixmap")

Ответ 3

Например, plot() будет делать разные вещи в зависимости от объекта. Вы можете увидеть конкретные функции графика (называемые методами), используя plot.ts(), plot.lm() и т.д., Т. Е. Plot() вызовет plot.ts(), если передается объект ts. В общем случае plot.xxx() применяется к объектам класса xxx. Если для класса нет конкретного метода, используется plot.default().

Функция plot() называется общей функцией, потому что она может применяться ко многим различным классам. Другие общие общие функции: summary(), print() и pred().

Как говорит Дирк, стоит прочитать документацию по методам и классам S3.

Ответ 4

В другом случае, не описанном в ответах, см. ответы, представленные в разделе "просмотр исходного кода в R"

который имеет дело с функциями, которые отображаются в виде "невидимых" при запуске методов (function.I.am.looking.for)

Вкратце вы можете использовать команду формы: package: function.class чтобы увидеть нужный код.

Ответ 5

Недавно я наткнулся на CRAN Meta репозиторий на GitHub, который в основном содержит версию всех пакетов в репозитории CRAN для чтения. Вы можете выполнить поиск по имени пакета, после выбора пакета, в котором вы находитесь, после того, как внутри него находится папка с именем R, в которой размещен исходный код в R.

Например, я искал пакет mboost, нажал на него и ввел папку R, которая показывает этот список код.

У меня еще не было случая, когда я не мог найти то, что было после. Я также не получил, чтобы увидеть, отображается ли ВСЕ базовый код C/С++ или связанный, но это был пример mboost выше. C-код находился в другой папке верхнего уровня с именем src