如何使用for循环减少编译时间

如何使用for循环减少编译时间,r,R,我有下面的R代码 目标:我试图通过迭代和比较两个对象的字符位置来检查kind对象中的字符串是否是word对象的组合。如果它是另一个的组合,则返回正的,否则返回负的 问题陈述: 如果kind对象值在每个字符串c'abcde'、'crnas'、'onarus'、'ravus'中都有最少的字符,那么它会给我更好的响应。如果种类对象中存在的字符串的字符串长度大于10^5 c'cdcdc..{1LCharacters}'、'fffw..{1LCharacters}'、'efefefef..{1LChara

我有下面的R代码

目标:我试图通过迭代和比较两个对象的字符位置来检查kind对象中的字符串是否是word对象的组合。如果它是另一个的组合,则返回正的,否则返回负的

问题陈述:

如果kind对象值在每个字符串c'abcde'、'crnas'、'onarus'、'ravus'中都有最少的字符,那么它会给我更好的响应。如果种类对象中存在的字符串的字符串长度大于10^5 c'cdcdc..{1LCharacters}'、'fffw..{1LCharacters}'、'efefefef..{1LCharacters}'。这需要更多的时间来处理。有没有更好的方法来实现这一点,这样编译时间就可以相对较少

非常感谢您的建议/更正

word <- "coronavirus"
total <- "3"
kind <- c('abcde','crnas','onarous','ravus')

invisible(lapply(kind,function(x) {

    if (length(x) > length(word)) {
    cat("NEGATIVE",sep='\n') 
    }
    index=1;
    for (i in seq(from=1,to=nchar(word)-1,by=1)) {
    
                    
        if(substr(word,i,i) == substr(x,index,index))
        {
          index<-index+1;
        }           

    }
    if (index == nchar(x))
    {
        cat("POSITIVE",sep='\n')
    }
    else
    {
      cat("NEGATIVE",sep='\n')   
    }   
}))

使现代化 如果要垂直打印结果,可以尝试下面的cat

cat(
  paste0(c("NEGATIVE", "POSITIVE")[
    1 +
      sapply(
        gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
        grepl,
        x = word
      )
  ], collapse = "\n"),
  "\n"
)
c("NEGATIVE", "POSITIVE")[
  1 +
    sapply(
      gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
      grepl,
      x = word
    )
]
我想你可以试试下面的gsub+grepl

cat(
  paste0(c("NEGATIVE", "POSITIVE")[
    1 +
      sapply(
        gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
        grepl,
        x = word
      )
  ], collapse = "\n"),
  "\n"
)
c("NEGATIVE", "POSITIVE")[
  1 +
    sapply(
      gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
      grepl,
      x = word
    )
]
使现代化 如果要垂直打印结果,可以尝试下面的cat

cat(
  paste0(c("NEGATIVE", "POSITIVE")[
    1 +
      sapply(
        gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
        grepl,
        x = word
      )
  ], collapse = "\n"),
  "\n"
)
c("NEGATIVE", "POSITIVE")[
  1 +
    sapply(
      gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
      grepl,
      x = word
    )
]
我想你可以试试下面的gsub+grepl

cat(
  paste0(c("NEGATIVE", "POSITIVE")[
    1 +
      sapply(
        gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
        grepl,
        x = word
      )
  ], collapse = "\n"),
  "\n"
)
c("NEGATIVE", "POSITIVE")[
  1 +
    sapply(
      gsub("(?<=.)(?=.)", ".*", kind, perl = TRUE),
      grepl,
      x = word
    )
]
你也可以这样做:

vals <- attr(adist(kind, word,counts = TRUE), 'counts')[,,3]
ifelse(vals>0, 'NEGATIVE', 'POSITIVE')
[1] "NEGATIVE" "POSITIVE" "NEGATIVE"
你也可以这样做:

vals <- attr(adist(kind, word,counts = TRUE), 'counts')[,,3]
ifelse(vals>0, 'NEGATIVE', 'POSITIVE')
[1] "NEGATIVE" "POSITIVE" "NEGATIVE"


首先,在您的示例中,lengthx和lengthword始终为1。那么为什么要比较它们呢?你到底想实现什么?Onyanbu我想检查实物中的单词object是单词object的组合。你可以忽略这一行的长度和长度。@onyanbu我已经更新了代码和问题陈述。我相信下面提供的答案就足够了。选择最好的一个并接受它,因为答案是“编译”指的是编程语言上下文中非常具体的东西,与您的问题无关。首先,在您的示例中,lengthx和lengthword都将始终为1。那么为什么要比较它们呢?你到底想实现什么?Onyanbu我想检查实物中的单词object是单词object的组合。你可以忽略这一行的长度和长度。@onyanbu我已经更新了代码和问题陈述。我相信下面提供的答案就足够了。选择最好的一个并接受它,因为答案是“编译”指的是编程语言上下文中非常具体的东西,与您的问题无关。哇,可爱的adist方法,向上投票!在这里使用adist很好,但坦率地说,这段代码是完全不透明的,因为它更倾向于聪明而不是清晰。使用ifelse或类似的东西代替隐式逻辑=>数字转换将极大地提高可读性,使用正确命名的临时变量也会有所帮助。@KonradRudolph ifelse在这里究竟如何工作?这显然是一个字符串比较问题,检查种类字符串中的所有字母是否以相同的给定顺序在单词字符串中。您能用ifelse提供解决方案吗?@onyanbu您正在隐式地将adist返回的计数转换为本地值。这就是我指的。换言之,将c'NEGATIVE','POSITIVE'[1+!attradist…,'counts'[,3]]替换为ifelseatradist…,'counts'[,'sub']>0L,'NEGATIVE','POSITIVE'。如前所述,当为替换计数引入变量名时,这变得更加可读。-我喜欢你的解决方案的聪明,但它是代码高尔夫,不可读/不可维护。哇,可爱的adist方法,上乘!在这里使用adist很好,但坦率地说,这段代码是完全不透明的,因为它更倾向于聪明而不是清晰。使用ifelse或类似的东西代替隐式逻辑=>数字转换将极大地提高可读性,使用正确命名的临时变量也会有所帮助。@KonradRudolph ifelse在这里究竟如何工作?这显然是一个字符串比较问题,检查种类字符串中的所有字母是否以相同的给定顺序在单词字符串中。您能用ifelse提供解决方案吗?@onyanbu您正在隐式地将adist返回的计数转换为本地值。这就是我指的。换言之,将c'NEGATIVE','POSITIVE'[1+!attradist…,'counts'[,3]]替换为ifelseatradist…,'counts'[,'sub']>0L,'NEGATIVE','POSITIVE'。如前所述,当为替换计数引入变量名时,这变得更加可读。-我喜欢你的解决方案的聪明,但它是代码高尔夫,不可读/不可维护。嗨,托马斯,我如何在没有其他提及的情况下,一个比另一个低一个地获得输出值。正负NEGATIVE@ChennaiCheetah有关代码,请参阅我的UpdateAnks.:。如果我像这个input@ChennaiCheetah一样传递输入,那么你可以使用gsub?嗨,托马斯,我如何在没有其他提及的情况下,一个低于另一个地获得输出值。正负NEGATIVE@ChennaiCheetah有关代码,请参阅我的UpdateAnks.:。如果我像这个input@ChennaiCheetah那样传递输入,那么你可以使用gsub吗?