Пример, приведенный @ Technophobe01, хорош, но не очень практичен.Вы всегда должны писать для каждого псевдонима новую функцию и новое определение класса.Много работы!
Исходя из Lisp, я думал о твоей проблеме.В таких случаях в Лиспе можно определить макросы для поиска псевдонимов.Самая крутая вещь это reader-macros
.С помощью читателей-макросов вы можете изменить способ, которым интерпретатор Lisp «видит» код.В основном макросы чтения начинаются с #
.
Однако мы не находимся в Лиспе.Мы находимся в R. У нас нет этих возможностей.
Единственный способ в R дать R "прочитать" выражение с другими правилами - это переопределить метод $
(возможно, однажды япридет с этим решением - или с кем-то еще ... - но одно большое препятствие заключается в том, что $
является примитивом - нам не везет ...), или же: вы используете функцию (в моем случае: with.alias()
сокращено до: a()
для alias
), в пределах которого изменяются правила.Я пошел этим путем.
С моим решением вы можете сделать вот что:
Как это будет работать
# your normal data frame definition
df <- data.frame(LBTPT = 1:3)
# now df contains:
df
## LBTPT
## 1 1
## 2 2
## 3 3
# define your aliases for each data frame in this form:
define.alias(df, list("LBTPT" = "TPT"))
# within the `define.alias()` function, you give as the first argument
# the data frame symbol, for which aliases should be defined.
# the second argument is a list of "original name" = "alias" definitions.
# This is how you call your data frame with the alias name:
a(df$TPT) # returns what d$LBTPT returns
## actually `with.alias` but shortened to: `a`
# call within `a()` or `with.alias()` the data frame with the aliased column name.
# the function then looks up in the attributes `aliases` of the data frame
# the original name of the alias for the column and
# returns the value of the originally named column.
Определите только три функции
Так вы определяете функции define.alias()
и with.alias()
и краткую форму a()
:
define.alias <- function(df, alias.list) {
# revert definition list
l <- names(alias.list)
names(l) <- alias.list
l <- as.list(l)
# metaprogrammatically assign "aliases" attribute to data frame
df <- substitute(df)
alias.list <- substitute(l)
eval(bquote(attr(.(df), "aliases") <- .(alias.list)), env = parent.env(environment()))
}
.with.alias <- function(df.expr) {
exp <- df.expr
df <- exp[[2]]
l <- eval(bquote(attr(.(exp[[2]]), "aliases")), env = parent.env(environment()))
eval(bquote(substitute(.(exp), l)))
}
with.alias <- function(df.expr) {
exp <- substitute(df.expr)
l <- eval(bquote(attr(.(exp[[2]]), "aliases")), env = parent.env(environment()))
if (exp[[1]] == "<-") {
l <- eval(bquote(attr(.(exp[[2]][[2]]), "aliases")), env = parent.env(environment()))
eval(eval(bquote(substitute(.(.with.alias(exp[[2]])) <- .(exp[[3]])))), env = parent.env(environment()))
} else {
df <- exp[[2]]
eval(eval(bquote(substitute(.(exp), l))), env = parent.env(environment()))
}
} # that's it! works!
Тип: выможно сэкономить при наборе текста, определив:
# make `with.aliases` shorter:
a <- with.aliases
## and now:
a(df$TPT) # works, too!
Хорошо, но мне все еще нужно работать с '<-'
методами.Простое назначение в a
работает, хотя
a(df$TPT <- new.vetor) # assigns correctly
a(df$TPT[3] <- 3) # but this not yet ...