Заменить петлю в R - PullRequest
       6

Заменить петлю в R

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

Я написал код для циклического прохождения, получения входных данных и добавления значения к

f1 <- file("stdin")
open(f1)
arr = c(0, 0, 0, 0, 0)
for(i in 1:3){
#user will provide the input 3 times. It will be a space separated input. Each input will have 3 numbers. 
#1st will indicate the starting index. 
#2nd will indicate the ending index. 
#And 3rd will indicate the value to be added between the starting and ending index

  inp1 = readLines(f1, n = 1, warn = FALSE)
  spl = strsplit(inp1, " ")[[1]]
  a = as.numeric(spl[1]) #start index
  b = as.numeric(spl[2]) #end index
  k = as.numeric(spl[3]) #value to be added

  arr[a:b] = arr[a:b] + k
}
arr

Пример ввода:

1 3 5

1 3 5

2 4 5

Ожидаемый результат:

10 15 15 5 0

Есть ли способ улучшить его производительность, возможно, исключив цикл for.

Ответы [ 2 ]

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

Вы хотите прочитать строки пользовательского ввода, три столбца, разделенных пробелами: начальный индекс, конечный индекс, значение, где два индекса находятся в диапазоне 1: 5.

arr <- rep(0, 5)

input_to_vector <- function(si, ei, val) {
          tmp <- rep(0, 5)
          tmp[si:ei] <- val
          return(tmp)
      }

Read your input line directly with `scan(what = list('integer','integer','integer'))`

for (inp1 in scan(what = list('integer','integer','integer'))) { ... }

Then lapply/sapply input_to_vector on that input.

Sum the output (column-wise).
0 голосов
/ 27 июня 2018

Это работает:

Мы помещаем strsplit вне цикла, затем используем sapply, чтобы создать выходную матрицу и получить rowSums.

arr = rep(0, 5)
inp1 <- c("1 3 5", "1 3 5", "2 4 5")
spl <- lapply(strsplit(inp1, " "), as.numeric)

rowSums(sapply(spl, function(x){
  arr[x[1]:x[2]] <- arr[x[1]:x[2]] + x[3]
  return(arr)
}))

[1] 10 15 15  5  0

Чтобы увеличить это значение до нескольких inp1, вы можете использовать вложенный list и просто обернуть еще один вызов lapply вокруг цикла.

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