Автоматическое сравнение R-кода со скриптом решения - PullRequest
0 голосов
/ 07 февраля 2019

Как можно автоматически сравнить R-Script со сценарием решения, если объекты имеют разные имена и длина сценария превышает 2 строки.

Сценарий решения:

table(bfi_i$age)
barplot(table(bfi_i$age),
        xlab = "Alter",
        ylab = "n")
x <- 3

Примерscript:

table(bfi_i$age) # correct
barplot(table(bfi_i$age)) # bracket too early
        xlab = "Altersgruppe" # missing comma
        ylab = "Haufigkeit" # missing comma
        col = c("lightblue", "mistyrose") # the place for the bracket
y <- 3 # correct

Пакетный тест, который, кажется, не помогает с более сложными скриптами.Я бы хотел, чтобы он оставался в RStudio, потому что это естественный способ использования R.

Кто-нибудь может мне помочь с этим?

Моя попытка до сих пор.Это довольно грязно и без листа решения пока:

# read all files
setwd('H:/')
folder_name <- getwd()
(all_files <- list.files(folder_name, include.dirs = F, recursive = F,
                        ignore.case = TRUE, pattern = glob2rx("*.R")))
student_files <- sapply(all_files, function(file) {
  student_code <- data.frame(Check = as.character(""),
                             read.delim(file, header = F, sep = "#",
                                        stringsAsFactors = F, quote = "`" 
                                        ))
  names(student_code)[2] <- "commands"
  names(student_code)[3] <- "comments"
  student_code
})

####check single files####
Erg1 <- student_files[[1]][1:3]
Erg1$Check<- as.character(Erg1$Check)
Erg1$commands <- trimws(Erg1$commands, which = c("both"))
test <- Erg1

setwd("H:/")
load("file.rda")

feedback <- c("correct", "1", "2")
x = 0; z = 0; cat('\14'); dev.off()
for(i in 1 : (nrow(test))) {
  cat(crayon::green(paste0(row.names(test[i, ]),". l: ", test[i, 3]), "\n"))
  if (test[i, 2] != "rm(list=ls())" && test[i, 2] != "cat('\\014')" && 
      test[i, 2] != "dev.off()" && !grepl("load", test[i, 2]) && 
      !grepl("setwd", test[i, 2])) {
    if (test[i, 2] != ""){
      # longer commands
      if (stringr::str_sub(test[i, 2], nchar(test[i, 2])) == ",") { 
        x = x + 1; next
      } else {
        cat("\n"); cat(crayon::underline(paste(test[(i - x) : i, 2], "\n")))
        test[(i - x), 1] <- sample(feedback, 1)
        tryCatch(print(z <- eval(parse(text = test[(i - x) : i, 2]))),
                 warning = function(w)  {
                   test[(i - x), 1] <- "Warning" # doesn't work yet
                   cat(crayon::red(crayon::bold("Warn_DF \n")))
                 },
                 error = function(e) {
                   test[(i - x), 1] <- "error" # doesn't work yet
                   cat(crayon::red(crayon::bold("error_DF \n")))
                 }
        )
        if (is.na(z) || is.character(z) || is.null(z)) {
          cat(crayon::red(crayon::bold("check_DF \n")))
        } else {cat(crayon::bold(paste(sample(feedback, 1), "\n")))}
        browser() # stop for each task
        x = 0}}}}
...