Изучая R
, я только что наткнулся на следующий код, объясненный здесь.
open.account <- function(total) {
list(
deposit = function(amount) {
if(amount <= 0)
stop("Deposits must be positive!\n")
total <<- total + amount
cat(amount, "deposited. Your balance is", total, "\n\n")
},
withdraw = function(amount) {
if(amount > total)
stop("You don't have that much money!\n")
total <<- total - amount
cat(amount, "withdrawn. Your balance is", total, "\n\n")
},
balance = function() {
cat("Your balance is", total, "\n\n")
}
)
}
ross <- open.account(100)
robert <- open.account(200)
ross$withdraw(30)
ross$balance()
robert$balance()
ross$deposit(50)
ross$balance()
ross$withdraw(500)
Больше всего в этом коде меня заинтересовало использование знака доллара "$"
, который ссылается на определенную внутреннюю функцию
в функции open.account()
. Я имею в виду эту часть:
ross$withdraw(30)
ross$balance()
robert$balance()
ross$deposit(50)
ross$balance()
ross$withdraw(500)
Вопросы:
1- Что означает знак доллара "$"
в R
function()
?
2- Как идентифицировать свои атрибуты в функциях, особенно для функций, которые вы перенимаете у других (т.е. вы их не писали)?
Я использовал следующий скрипт
> grep("$", open.account())
[1] 1 2 3
но это бесполезно Я хочу найти способ извлечь имя (имена) внутренних функций, на которые можно ссылаться по "$", не просто вызывая и перебирая написанный код как > open.account()
.
Например, в случае open.account()
я'хотел бы видеть что-то вроде этого:
$deposit
$withdraw
$balance
3- Есть ли какая-нибудь ссылка, где я могу прочитать больше об этом?
спасибо!
Символ $
позволяет извлекать элементы по имени из именованного списка. Например
x <- list(a=1, b=2, c=3)
x$b
# [1] 2
Вы можете найти имена списка, используя names()
.
names(x)
# [1] "a" "b" "c"
Это базовый оператор извлечения. Вы можете просмотреть соответствующую страницу справки, набрав в R команду `?Extract'.
В R существует четыре формы оператора extract: [
, [[
, $
и @
. Четвертая форма также известна как оператор слота и используется для извлечения содержимого из объектов, построенных с помощью объектной системы S4, также известной как формально определенный объект в R. Большинство начинающих пользователей R не работают с формально определенными объектами, поэтому здесь мы не будем обсуждать оператор слота.
Первая форма, [
, может быть использована для извлечения содержимого из векторов, списков или массивов данных.
Вторая и третья формы, [[
и $
, извлекают содержимое из одного объекта.
Оператор $
использует имя для выполнения извлечения, как в anObject$aName
. Поэтому он позволяет извлекать элементы из списка на основе их имен. Поскольку data.frame()
также является list()
, он особенно хорошо подходит для доступа к столбцам в кадре данных. Тем не менее, эта форма не работает с вычисляемым индексом или подстановкой переменной в функции.
Аналогично, можно использовать формы [
или [[
для извлечения именованного элемента из объекта, например anObject["namedItem"]
или anObject[["namedItem"]]
.
Более подробную информацию и примеры использования каждой из форм оператора можно найти в моей статье Forms of the Extract Operator.
Часто требуется выбрать целый столбец, а именно одну конкретную переменную из фрейма данных. Например, если вы хотите выбрать все элементы переменной diameter, то вам подойдут оба варианта: dataframe_name[,colomn_position] dataframe_name[,"colomn_name"].
Однако есть и короткий путь. Если ваши столбцы имеют имена, вы можете использовать знак $:
dataframe_name$colomn_name.