Сохранить результаты из функции, содержащей цикл for - PullRequest
0 голосов
/ 09 февраля 2019

expeRts

Я создал функцию, которая подсчитывает количество строк, удовлетворяющих некоторым условиям.Я сделал эту функцию, потому что одно из условий должно принимать разные метки, которые есть у меня в векторе - я не использовал фильтр, так как мне пришлось бы изменить одно из условий в фильтре и снова и снова возвращаться к исходному фрейму данных,Моя функция:

counting <- function(df, na.rm = TRUE, ...) {

    for (i in seq_along(counties)) {   
      observations<-
      nrow(subset(financial_environment, 
financial_environment$county==counties[i]
                  & population> 500000))
      print(observations) }
}
counting(financial_environment)

Проблема в том, как сохранить выходы консоли в векторе (внутри которого есть цикл for). Мне бы хотелось, чтобы этот вектор создавал фрейм данных с предыдущими векторами в моем коде.

Я читал другие вопросы о стековом потоке, но функции выглядят немного базовыми по сравнению с тем, который я сделал,В этих ответах рекомендуется следующее:

Создать вектор, в котором будут сохранены результаты.results <- vector("numeric", 650L)

Затем просто измените строку функции:

counting <- function(df, na.rm = TRUE, ...) {

    for (i in seq_along(counties)) {   
      observations<- 
      nrow(subset(financial_environment, 
financial_environment$county==counties[i]
                  & population> 500000))
      print(observations)}

Затем я просто применил бы функцию к фрейму данных и увидел бы вектор «результатов» counting(financial_environment) results делая это, вектор «результатов» имеет только ноль внутри.

Я пробовал также с sapply, но консоль показала 1000 наблюдений.Я заметил, что результаты были повторены, т. Е. Последние 450 результатов были первыми 450 выходами при применении функции.

Буду очень признателен за ваши комментарии и предложения.

1 Ответ

0 голосов
/ 09 февраля 2019

Если я правильно понял, что-то вроде этого должно работать:

results <- vector("numeric", 650L)

counting <- function(someOption) {
  for (i in seq_along(someOption)) {   
    observation <- insertHereYourCodeForObservation
    results[i] <- observation
  }
  results
}

results <- counting(someOption = someData)

В этом случае функция возвращает массив results, который затем явно присваивается results.

В качестве альтернативы, значение results может быть изменено непосредственно изнутри функции, используя <<-, как это (как указано в Ben373, это не рекомендуется):

results <- vector("numeric", 650L)

counting <- function(someOption) {
  for (i in seq_along(someOption)) {   
    observation <- insertHereYourCodeForObservation
    results[i] <<- observation
  }
}

counting(someOption = someData)

обратите внимание, что в этом последнем кодефункция ничего не возвращает.

...