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

Я пытаюсь преобразовать символьную переменную в логическое выражение, чтобы использовать ее позже в аргументе подмножества функции subset(), и все это находится внутри более крупной функции, называемой 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)
  }
}  

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


Ответы (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
person agstudy    schedule 14.06.2015
comment
Спасибо за ваш ответ. Однако я попробовал это внутри моей функции 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 # ###, цитата = ЛОЖЬ) }` - person ayalaall; 14.06.2015
comment
Вы должны заменить 2 строки `keep_rows ‹- as.logical(keep_rows); raw_data ‹‹- subset(raw_data, keep_rows)` по моему коду. - person agstudy; 14.06.2015
comment
Спасибо. Именно так я и сделал, и теперь он сохраняет все строки и не удаляет строки, в которых блок › 1 - person ayalaall; 14.06.2015
comment
@ayalaall Это должно работать. Не используйте глобальный оператор <<-. Просто назначьте <- и не забудьте вернуть результат в конце вашей функции... - person agstudy; 14.06.2015
comment
Привет снова. У меня тот же вопрос, но с аргументом выбора подмножества(). Я попробовал то, что вы предложили с аргументом select, и это не сработало: когда я пытаюсь передать строковый вектор функции early_prep(file_name = "n44.txt", keep_col = c("soa", "congruency")), а затем использовать его в подмножестве: raw_data <- subset(raw_data, select = keep_col), я получаю предупреждающее сообщение о том, что условие имеет длину › 1 и будет использоваться только первый элемент. Кто-нибудь знает, что я могу сделать? Спасибо! - person ayalaall; 17.06.2015
comment
@ayalaall, пожалуйста, не задавайте вопросов в комментариях. Лучше задать новый вопрос. - person agstudy; 17.06.2015