Функция с переменными, которые имеют разный размер - PullRequest
0 голосов
/ 12 июня 2018

Итак, я пытаюсь запустить функцию ниже, в надежде получить 224 вектора на выходе, но только один, и я понятия не имею, почему.

ee <- 0.95
td <- 480

tt <- c(60,10,14,143,60)
tt <- as.data.frame(tt)

r <- vector()

m <- function(d)
{
    n <- length(tt)
    c <- nrow(d)
    for (j in 1:c)
{
    for (i in 1:n)
{
    r[i] <- tt[i]/(td*ee/d[j,])
}
    return(r)  
}

#where d is a data frame of 224 obs. of 1 variable

и вывод, который я получаю,

[[1]]
[1] 1026.3158  171.0526  239.4737 2446.0526 1026.3158

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

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

r <- vector()

m_bis <- function(d) {

  res <- list() # store all the vectors here

  n <- length(tt)
  c <- nrow(d)

  for (j in 1:c) {
    for (i in 1:n) {
      r[i] <- tt[i] / (td * ee / d[j,])
    }
    res[j] <- r
  }  
  return(res)
}

Это должно привести к примерно так:

m_bis(as.data.frame(mtcars$mpg))
> [[1]]
  [1] 2.7631579 0.4605263 0.6447368 6.5855263 2.7631579
  ...
  [[32]]
  [1] 2.8157895 0.4692982 0.6570175 6.7109649 2.8157895
0 голосов
/ 12 июня 2018
outer(as.vector(tt[,1]), as.vector(d[,1]), function(x,y){x*y/(td*ee)})

Используйте векторизацию для ускорения вычислений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...