2015-06-05 3 views
0

Вот пример из передовой R книги Хедли:Объединить подмножество и выберите нестандартной оценку в R

select <- function(df, vars) { 
    vars <- substitute(vars) 
    var_pos <- setNames(as.list(seq_along(df)), names(df)) 
    pos <- eval(vars, var_pos) 
    df[, pos, drop = FALSE] 
} 
select(mtcars, mpg:disp) 

Я пытаюсь объединить эту функцию в subset2 функции:

subset2 = function(df, cond_expr, vars = "..all") { 
    df = df[which(eval(substitute(cond_expr), df, parent.frame())), , drop = FALSE] 
    if(vars == "..all") { 
     df 
    } else { 
     browser() 
     vars = substitute(vars) 
     var_pos = setNames(as.list(seq_along(df)), names(df)) 
     eprint(var_pos) 
     pos = eval(vars, var_pos) 
     df[, pos, drop = FALSE] 
    } 
} 
subset2(mtcars, mpg > 24) 
subset2(mtcars, mpg > 24, vars = mpg:disp) 

Выбор строки все еще работает, но выбор колокола не срабатывает немедленно:

Error in subset2(mtcars, mpg > 24, vars = mpg:disp) : 
    object 'disp' not found 

Обратите внимание, что я ve вставил browser() в ветку else, предложения об ошибках, которые ветвь никогда не была введена.

+0

Попробуйте 'если (заменяющее (Перо) ==» ..all ")' –

+0

Был ли мой ответ полезен для вас? –

ответ

0

Это исправление работает для меня:

subset2 = function(df, cond_expr, vars = "..all") { 
    df = df[which(eval(substitute(cond_expr), df, parent.frame())), , drop = FALSE] 
    if(substitute(vars) == "..all") { 
    df 
    } else { 
#  browser() 
    vars = substitute(vars) 
    var_pos = setNames(as.list(seq_along(df)), names(df)) 
#  eprint(var_pos) 
    pos = eval(vars, var_pos) 
    df[, pos, drop = FALSE] 
    } 
} 

> subset2(mtcars, mpg > 24, vars = mpg:disp) 
       mpg cyl disp 
Merc 240D  24.4 4 146.7 
Fiat 128  32.4 4 78.7 
Honda Civic 30.4 4 75.7 
Toyota Corolla 33.9 4 71.1 
Fiat X1-9  27.3 4 79.0 
Porsche 914-2 26.0 4 120.3 
Lotus Europa 30.4 4 95.1 

Обратите внимание, что я должен комментировать строку с eprint функции, что я не мог найти