Вопрос по subset, r – Передать аргумент подмножества через функцию в подмножество

4

Я хотел бы иметь функцию, которая вызываетsubsetи передает наsubset аргумент:

df <- data.frame(abc=c("A","A","B","B"),value=1:4)
subset(df,abc=="A")
## works of course:
#  abc value
#1   A     1
#2   A     2

mysubset <- function(df,ssubset)
  subset(df,ssubset)

mysubset(df,abc=="A")
## Throws an error
# Error in eval(expr, envir, enclos) : object 'abc' not found

mysubset2 <- function(df,ssubset)
  subset(df,eval(ssubset))

mysubset2(df,expression(abc=="A"))
## Works, but needs expression

Я пробовал сsubstitute, но не смог найти правильную комбинацию. Как я могу заставить это работать?

Посмотри на это:github.com/hadley/devtools/wiki/Evaluation James
Связанный вопрос:stackoverflow.com/questions/9860090/… flodel
Джеймс, спасибо за ссылку, этоvery проницательный! Florian Bw
Обновленная ссылка на страницу Хэдли по оценке и подмножеству:adv-r.had.co.nz/Computing-on-the-language.html Aaron

Ваш Ответ

2   ответа
3

Ответ A5C1D2H2I1M1N2O1R2T1 работает, но вы можете пропустить весь цикл разбора / разбора, просто используя:

mysubset <- function(df, p) {
  ps <- substitute(p)
  subset(df, eval(ps))
}
12

Тебе нужноeval() а такжеparse() там тоже:

mysubset <- function(df, ssubset) {
  subset(df, eval(parse(text=ssubset)))
}
mysubset(df, "abc=='A'")
#   abc value
# 1   A     1
# 2   A     2

Обратите внимание, что вам нужно вкладывать кавычки, поэтому переключайтесь между" а также' как необходимо.


Исходя из вашего комментария, возможно, что-то подобное также представляет интерес:

mysubset <- function(df, ...) {
  ssubset <- deparse(substitute(...))
  subset(df, eval(parse(text = ssubset)))
}

ИСПОЛЬЗОВАНИЕ:mysubset(df, abc=='A')

Что-то подобное вы имеете в виду?mysubset <- function(df, ...) { ssubset <- deparse(substitute(...)); subset(df, eval(parse(text = ssubset))) }, ИСПОЛЬЗОВАНИЕ:mysubset(df, abc=='A')
Спасибо за ответ. Вы знаете, есть ли возможность сделать это без кавычек? Florian Bw
Отлично, спасибо, принимаю ваш ответ. Было бы неплохо, если бы вы могли добавить эту возможность и в свой основной ответ. Florian Bw

Похожие вопросы