В R есть много ситуаций, когда кажется, что with
используется, чтобы помочь вам написать более короткий код; однако это маскирует существующие символы, такие как локальные переменные и параметры функций. Есть ли способ ссылаться на них, не переименовывая их, чтобы они не конфликтовали с вашими данными?
Например, в этом фрейме у меня есть столбец state
;
df <- data.frame(
label=c("a", "b", "c"),
state=c("off","on","off"))
Я могу написать функцию фильтрации с параметром .state
, и фильтр работает;
instateWorks <- function(.state) {
subset(df, df$state == .state)
}
# correct - 1 observation for "b"
onWorks <- instateWorks("on")
но если я даю своей функции разумное имя параметра, возникает проблема, и символ state
, похоже, относится к столбцу фрейма данных;
instateFails <- function(state) {
subset(df, df$state == state)
}
# fails - all 3 observations
onFails <- instateFails("on")
Есть ли способ уточнить, что state
должен означать параметр, чтобы скрипт работал должным образом?
Изменить - чтобы уточнить, почему "with" и "eval" являются проблемой, с которой я борюсь, рассмотрите этот код;
df <- data.frame(
label=c("a", "b", "c"),
state=c("off","on","off"))
with(df, state == "on")
# FALSE TRUE FALSE
state <- on
with(df, state == state)
# TRUE TRUE TRUE
В последнем операторе with
я ищу способ выразить «скажите мне, в каких строках переменная 'state' в DF имеет то же значение, что и переменная 'state', определенная в строке выше.
Без этой возможности я не могу написать функцию с параметром, который называется так же, как имя столбца.
help(subset)
- Предупреждение Это удобная функция, предназначенная для интерактивного использования. Для программирования лучше использовать стандартные функции подмножества, такие как[
, и, в частности, нестандартное вычисление подмножества аргументов может иметь непредвиденные последствия. - person Rich Scriven   schedule 20.04.2016filter(df, state == state)
. Это общая проблема с передачей выражений функциям, которыеeval
находятся в среде, отличной от вызывающей функции. - person Steve Cooper   schedule 20.04.2016dplyr
вы должны использоватьfilter_()
внутри функций (обратите внимание на_
). Для этой цели пакет был написан со стандартной версией. Если у вас есть вопрос оwith()
, отредактируйте, потому чтоwith()
не используется вsubset()
. - person Rich Scriven   schedule 20.04.2016with(df, state == get("state", globalenv()))
, чтобы пойти и получитьstate
из глобальной среды. Но, как вы можете видеть, мы победили цель более короткого кода, так как теперь мы можем просто сделатьdf$state == state
. Кроме того, он может стать волосатым, используяget()
- person Rich Scriven   schedule 20.04.2016instateFails <- function(state) { args <- environment(); subset(df, state == args$state) }
для дифференциации -- создайте переменную с именем args (или как-то так), которая позволит мне обращаться к переменным в вызывающей функции из выражения фильтра. Должно работать везде, и это однострочный обходной путь... - person Steve Cooper   schedule 20.04.2016