我已经编写了一个循环代码,获取输入并为
添加值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循环来实现的。
答案 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).