Функция перезаписывает один и тот же объект каждый раз: как я могу избежать этого? - PullRequest
0 голосов
/ 17 января 2020

Я хочу создать объект для каждой регрессии, которую я делаю (17 из них). В идеале функция должна создавать 17 различных объектов, которые я могу использовать потом. В настоящее время он просто пишет объект поверх предыдущего. Как я могу избежать этого? Было бы лучше, если бы объект был частично назван в честь определенного «имени файла», чтобы иметь возможность различать guish их впоследствии.

  dat <- read.csv(file = filename)
  reg2<<- lm(dat[,17]~dat[,6]+dat[,7])
  }

for (f in filenames) {
    upload(f)
}

1 Ответ

3 голосов
/ 17 января 2020

Это одна из самых больших проблем с глобальным присваиванием <<- внутри функции. У вашей функции return() модель, не назначайте, и выполняйте назначение за пределами функции.

# function returns the result, doesn't assign it
upload <- function(filename) {
  dat <- read.csv(file = filename)
  lm(dat[,17]~dat[,6]+dat[,7])
}

# assignment happens outside the function (like almost every other R function)
# this way you can use whatever name you want
reg2 <- upload("hello.csv")
reg3 <- upload("world.csv")

# or use a for loop
reg <- list()
for (f in filenames) {
  reg[[f]] <- upload(f)
}

# or use lapply for the same effect more concisely
reg <- lapply(filenames, upload)
names(reg) = filenames)

# You can now access individual list elements with [[
summary(reg[["hello.csv"]])

# Or extract all the model summary stats into a nice data frame
dplyr::bind_rows(lapply(reg, broom::glance))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...