R中的替换循环

时间:2018-06-27 11:56:19

标签: r

我已经编写了一个循环代码,获取输入并为

添加值
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 :(得分:1)

这有效:

我们将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调用。

答案 1 :(得分:1)

您想读取用户输入的行,三个空格分隔的列:开始索引,结束索引,值,其中两个索引的范围为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).