как объявить глобальную переменную внутри цикла for и почему оператор else читается как неожиданный? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть наборы данных, в которых есть столбцы сульфатов и нитратов. В зависимости от того, что выберет пользователь, возвращается либо среднее значение сульфата, либо среднее значение нитрата. У меня есть цикл for, и внутри него есть операторы IF и ELSE, чтобы разобраться с этим. При попытке скомпилировать data.frame (datada, vec1) возникает следующая ошибка:

«Ошибка в data.frame (datada, vec1): объект« datada »не найден»

Также,утверждение else считается неожиданным. Дана следующая ошибка:

"Ошибка: неожиданное 'else' в" else "

complete <- function(directory,pollutant = "sulfate", id = 1:332) {

  datada <- id
  filelist <- list.files(path = directory, pattern = ".csv", full.names = TRUE)

  vec <- numeric() 
  vec1 <- numeric()
  vec2 <- numeric()

  for(i in datada) {

    if (pollutant == "sulfate"){
      data <- read.csv(filelist[i])
      vec1<- c(vec1, colMeans(data$sulfate,na.rm = TRUE )

    }  
    data.frame(datada,vec1)                  #datada is not "found"

    else (pollutant == "nitrate"){              #else is "unexpected"
        data <- read.csv(filelist[i])
        vec2<- c(vec2, colMeans(data$sulfate,na.rm = TRUE )

      }  
      data.frame(datada,vec2)
  }

Вот как выглядит один набор данных:

          Date sulfate nitrate ID
1   2001-01-01      NA      NA  2
2   2001-01-02      NA      NA  2
3   2001-01-03      NA      NA  2
4   2001-01-04      NA      NA  2
5   2001-01-05      NA      NA  2
6   2001-01-06      NA      NA  2
7   2001-01-07      NA      NA  2
8   2001-01-08      NA      NA  2
9   2001-01-09      NA      NA  2
10  2001-01-10      NA      NA  2
11  2001-01-11      NA      NA  2
12  2001-01-12      NA      NA  2
13  2001-01-13      NA      NA  2
14  2001-01-14      NA      NA  2
15  2001-01-15      NA      NA  2
16  2001-01-16      NA      NA  2
17  2001-01-17      NA      NA  2
18  2001-01-18      NA      NA  2
19  2001-01-19    2.30   0.699  2
20  2001-01-20      NA      NA  2
21  2001-01-21      NA      NA  2
22  2001-01-22      NA      NA  2
23  2001-01-23      NA      NA  2
24  2001-01-24      NA      NA  2
25  2001-01-25    2.19   4.970  2

Свойожидается что-то вроде этого:

  datada vec
1      1 117
2      3 243
3      5 402
4      7 442
5      9 275

Генерируется data.frame (datada, vec1)

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Понятия не имею, почему datada не найдено - когда я попробовал упрощенную версию функции в моей системе, похоже, она работает нормально.

Что касается остального - else должен идти сразу после окончания оператора if. Это не ожидается, потому что вы поместили data.frame(datada,vec1) перед ним. Если вы поместите эту строку в {}, все должно быть в порядке.

Но, вообще говоря, ваш код излишне сложен, плюс он на самом деле ничего не возвращает.

Попробуйте что-то вроде этого:

complete <- function(directory,pollutant = "sulfate", id = 1:332) {
  datada <- id
  filelist <- list.files(path = directory, pattern = ".csv", full.names = TRUE)
  if (!(pollutant) %in% c("sulfate","nitrate")) stop("Unknown pollutant")
  lapply(filelist, function(x) {
    data<-read.csv(x)
    colMeans(data[,pollutant],na.rm=TRUE)
  })
}

Будет выведен список, где каждый элемент является вектором colMeans каждого из файлов. Вы можете заменить lapply на sapply, который (вероятно) даст вам матрицу вместо списка.

(обратите внимание, я не смог проверить это, потому что у меня нет набора данных, поэтому могут быть некоторыеошибки здесь)

0 голосов
/ 04 октября 2019

Если вы не хотите манипулировать объектами окружения, проще всего объявить вашу переменную вне функции и использовать <<- форму присваивания внутри функции.

datada <- NULL
...
complete <- function(directory,pollutant = "sulfate", id = 1:332) {
    datada <<- id
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...