【问题标题】:Loop in R with a function included在 R 中循环,包含一个函数
【发布时间】:2019-07-26 16:45:48
【问题描述】:

我是 R 的新手,我想做一个循环,以返回关键字列表的搜索量(通过 API 调用)。

这里是我使用的代码:

install.packages("SEMrushR")
library(SEMrushR)

mes_keywords_to_check <- readLines("voyage.txt") # List of keywords to check
mes_keywords_to_check <- as.character(mes_keywords_to_check)

循环

for (i in 1:length(mes_keywords_to_check)) {
  test_keyword <- as.character(mes_keywords_to_check[i])
  df_test_2 <- keyword_overview_all(test_keyword, "fr","API KEY NUMBER")  ##keyword_overview_all is the function from the Semrush package

}

通过这样做,我只能获得列表中第一个关键字的搜索量。我的目的当然是获取完整关键字列表所需的日期。

这是我得到的表格: enter image description here

你知道我该如何解决这个问题吗?

【问题讨论】:

  • 在循环之前检查mes_keywords_to_check:它是否包含所有关键字? // 检查length(mes_keywords_to_check)

标签: r function api for-loop


【解决方案1】:

嗯,您需要将结果添加到某种容器中。例如到一个列表。到目前为止,您只有一个对象,其中填充了来自循环的最新迭代的数据。

results = list()

for (i in 1:length(mes_keywords_to_check)) {
  test_keyword <- as.character(mes_keywords_to_check[i])
  df_test_2 <- keyword_overview_all(test_keyword, "fr","API KEY NUMBER")  ##keyword_overview_all is the function from the Semrush package
  results[[i]] <- df_test_2 
}

但是,大多数 R 专家建议不要使用循环

library("plyr")
result <- plyr::ldply(mes_keywords_to_check, function(x) keyword_overview_all(as.character(x), "fr","API KEY NUMBER"))

我没有对此进行测试,它可能需要一些调整,但它应该为您指明正确的方向。

【讨论】:

    【解决方案2】:

    看起来您正在阅读带有readLines("voyage.txt") 的文本文件,它将返回每行的列表。然后将这些行传递给 for 循环。下面将这些行转换为单词。有多种方法,但下面使用循环中的循环来继续使用 for(),以防您更喜欢逐行逐字搜索。它还使用正则表达式拆分非字母数字,以便您省略标点符号限制的单词。

    mes_lines <- readLines("voyage.txt") # List of keywords to check
    mes_lines <- as.character(mes_lines)
    
    search_results <- list()
    for (i in 1:length(mes_lines)) {
      mes_keywords_to_check <- unlist(strsplit(mes_lines,"[^[:alnum:]]"))
      mes_keywords_to_check <- mes_keywords_to_check[nchar(mes_keywords_to_check)>0]
    
      if (length(mes_keywords_to_check)==0) next
    
      for (w in 1:length(mes_keywords_to_check))
      {
        test_keyword <- as.character(mes_keywords_to_check[w])
        print(paste0("Checking word=",test_keyword))
        df_test_2 <- keyword_overview_all(test_keyword, "fr","API KEY NUMBER")  ##keyword_overview_all is the function from the Semrush package
        search_results <- append(search_results,df_test_2)
      }
    
    }
    

    搜索结果

    【讨论】:

      【解决方案3】:

      感谢您指出正确的方向。

      这是我所做的,这是有效的:

      final_result <- data.frame()
      mes_keywords_to_check <- readLines("voyage.txt") 
      mes_keywords_to_check <- as.character(mes_keywords_to_check)
      
      for (i in 1:length(mes_keywords_to_check)) {
        test_keyword <- as.character(mes_keywords_to_check[i])
          df_test_2 <- keyword_overview_all(test_keyword, "fr","API KEY")  
        final_result <- rbind(final_result,df_test_2)
      }
      

      【讨论】:

      • 如果您发现建议有助于确定您的解决方案,请在建议旁边打上绿色复选标记。
      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多