【问题标题】:expanded for loop code instead of shortcut for loop code [closed]扩展循环代码而不是循环代码的快捷方式[关闭]
【发布时间】:2018-09-21 21:42:27
【问题描述】:
y <- c()
for( position in c("cannon","jackson","benford","paws","moxie") ) {
n <- nchar(position)
y[position] <- letters[n]
}
y`

这是快捷代码,但是当我尝试制作扩展代码时遇到了困难。需要有 15 行代码。

【问题讨论】:

  • 欢迎来到 Stack,我不明白这个问题你介意扩展一下吗?
  • 您想要完成什么,在使用此代码时遇到了什么?
  • 我发布的代码是快捷方式,我需要写出不使用for循环函数的扩展代码。
  • @lop 你能解释一下“扩展代码”是什么意思吗?您还可以根据最小示例显示预期输出。
  • @markus 写出 for 循环用作快捷方式的 15 行代码。

标签: r for-loop


【解决方案1】:

给定一个字符向量

chars <- c("cannon", "jackson", "benford", "paws", "moxie")

任务是找出chars 的每个元素的字符数。然后我们想把这个结果和子集 letters 相应地。

第一种方法:复制和粘贴(不要那样做)

nchar_cannon <- nchar(chars[1])
nchar_jackson <- nchar(chars[2])
nchar_benford <- nchar(chars[3])
nchar_paws <- nchar(chars[4])
nchar_moxie <- nchar(chars[5])

letter_cannon <- letters[nchar_cannon]
letter_jackson <- letters[nchar_jackson]
letter_benford <- letters[nchar_benford]
letter_paws <- letters[nchar_paws]
letter_moxie <- letters[nchar_moxie]

out <- c(letter_cannon,
         letter_jackson,
         letter_benford,
         letter_paws,
         letter_moxie)
setNames(out, chars)

我想这就是你试图避免使用 ...

第二种方法:for-loop(很好,尽管在 R 社区 does not enjoy the best reputation

out <- c()
for( position in c("cannon","jackson","benford","paws","moxie") ) {
n <- nchar(position)
out[position] <- letters[n]
}
out

第三种方法:使用a functional

sapply(chars, function(x) letters[nchar(x)])

第四种方法:vectorization(推荐)

setNames(letters[nchar(chars)], chars)

基准测试

library(microbenchmark)
chars_long <- c(replicate(1e6, chars))

benchmark <- microbenchmark(
  loop_fun = loop_fun(chars_long),
  functional_fun = functional_fun(chars_long),
  vectorize_fun = vectorize_fun(chars_long),
  times = 100L
)

autoplot(benchmark)

#Unit: seconds
#           expr       min        lq      mean    median        uq      max neval
#       loop_fun  7.217346  8.142811  9.481697  9.431999 10.472183 13.54128   100
# functional_fun 10.540376 12.064269 13.062617 12.873895 13.738929 17.90349   100
#  vectorize_fun  1.227648  1.310427  1.450161  1.370944  1.552207  2.00134   100

基准测试中使用的函数

loop_fun <- function(x) {
  out <- c()
  for( position in x ) {
    n <- nchar(position)
    out[position] <- letters[n]
  }
  out
}

functional_fun <- function(x) {
  sapply(x, function(y) letters[nchar(y)])
}

vectorize_fun <- function(x) {
  setNames(letters[nchar(x)], x)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 2014-03-02
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2021-03-20
    相关资源
    最近更新 更多