2015-06-14 4 views
0

Я пытаюсь преобразовать переменную символа в логическое выражение, чтобы использовать его позже в аргументе подмножества функции подмножества(), и все это внутри большей функции, называемой early_prep(), которую я создал. Проблема заключается в том, когда я исполняюПреобразуйте переменную символа в логическое выражение, чтобы использовать ее позже внутри аргумента подмножества функции подмножества()

early_prep(file_name = "n44.txt", keep_rows = "block > 1") 

удаляет все строки в моем raw_data кадре данных, а не удалять только те, в которых блок> 1.

Любая помощь будет принята с благодарностью.

Бест, Аяла

Беллоу соответствующая часть функции early_prep():

early_prep <- function(file_name,keep_rows = FALSE){ 

    read_data <- function(file_name){ 
    extension <- substr(file_name, nchar(file_name) - 3, nchar(file_name)) 
    if (extension == ".txt"){ 
    raw_data <<- read.table(file_name, header = TRUE) 
    # Print to console 
    print("#### Reading txt file ####", quote = FALSE) 
    } else if (extension == ".csv"){ 
    raw_data <<- read.csv(file_name, header = TRUE) 
    # Print to console 
    print("#### Reading csv file ####", quote = FALSE) 
    } else { 
    # Stops running the function 
    stop("#### file_name should end with txt or csv extension ####", quote = FALSE)  
    } 
} 


    read_data(file_name) 

    if (keep_rows != FALSE) { 
    keep_rows <- as.logical(keep_rows) 
    raw_data <<- subset(raw_data, keep_rows) 
    # Print to console 
    print("#### Deleting unnecessary rows in raw_data ####", quote = FALSE) 
    } 
} 
+0

Почему не называйте это: 'early_prep (file_name = "n44.txt", keep_rows = block> 1) '. Вот как используется «подмножество» подмножества «подмножество» и как вызываются все функции регрессии, когда они передают выражения своим «подмножествам». Однако в «подмножестве» вам сообщается, что это функция удобства, не предназначенная для использования внутри функций. Вы не хотели бы выполнять предварительную оценку 'as.logical (keep_rows)', потому что выражение не будет иметь надлежащей среды. Это то, что предполагается подмножество. –

ответ

1

Попробуйте это:

subset(raw_data,eval(parse(text=keep_rows))) 

Тест:

keep_rows <- "Blok>1" 
raw_data<- data.frame(Blok=c(1,2,3,0)) 
subset(raw_data,eval(parse(text=keep_rows))) 

    Blok 
2 2 
3 3 
+0

Благодарим вас за ответ. Однако я пробовал это в своей функции early_prerp(), и на этот раз он не удаляет все строки в моем кадре данных raw_data, но он сохраняет все строки и не удаляет их в соответствии с keep_rows 'if (keep_rows! = FALSE) { #keep_rows <- as.logical (keep_rows) #raw_data << - subset (raw_data, keep_rows) subset (raw_data, eval (parse (text = keep_rows))) # Печатать на консоль print ("#### Удаление ненулевых строк в raw_data #### ", quote = FALSE) }' – ayalaall

+0

Вы должны получить 2 строки 'keep_rows <- as.logical (keep_rows); raw_data << - подмножество (raw_data, keep_rows) 'по моему коду. – agstudy

+0

Спасибо. Это именно то, что я сделал, и теперь он хранит все строки и не удаляет строки, в которых блок> 1 – ayalaall