Как проверить код функции в R, чувствительной к классу объектов - PullRequest
9 голосов
/ 17 сентября 2009

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

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

>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:

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

Ответы [ 5 ]

31 голосов
/ 18 сентября 2009

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

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

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

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

Пример: diag

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

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

Пример: среднее значение

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

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

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

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

Конец РЕДАКТИРОВАТЬ

Пример: qnorm

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

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

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

Конец РЕДАКТИРОВАТЬ

Случай 4: все еще не могу найти функцию

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

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

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

Тип getMethods("fnname", "myclass").

Пример: сюжетное растровое изображение

Для этого требуется пакет изображений.

library(pixmap)
pixie <- pixmap(1:12, nrow=3, ncol=4)
class(pixie)   #"pixmap"
showMethods(class="pixmap")
getMethod("plot", "pixmap")
7 голосов
/ 17 сентября 2009

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

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

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

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

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

4 голосов
/ 18 сентября 2009

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

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

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

0 голосов
/ 15 января 2016

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

Например, я искал пакет mboost , нажал на вход и вошел в папку R , в которой отображается список кодов .

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

0 голосов
/ 04 сентября 2013

Для другого случая, не охваченного здесь ответами, см. Ответы, представленные в « Просмотреть исходный код в R »

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

Короче говоря, вы можете использовать команду вида: package ::: function.class чтобы увидеть код, который вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...