Как проверить код функции в 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