【问题标题】:Create variable and dataset in a loop? (R)循环创建变量和数据集? (右)
【发布时间】:2019-08-04 22:02:02
【问题描述】:

这是我第一次尝试使用 R 构建函数。基本上我的预期目标如下。

  • 使用 RoogleVision 包与 Google Cloud Vision API 通信
  • 函数遍历目录中的图片
  • 从 Google Vision 功能中检索每张图片的所需信息
  • 将它们保存在单个聚合数据集中

以下是我正在使用的示例代码。我认为我正在努力的唯一部分是正确地“迭代”图片并不断创建数据集。

感谢任何帮助和建议!

提前致谢!

googlevision <- function(path) {
    path <- dirname(file.choose())  # Get directory
    setwd(path)
    pic_list <- list.files(path = path, pattern = "*.png")  # Get filename lists
    vision_data <- NULL
    for (i in pic_list) {
            text <- getGoogleVisionResponse(i, feature = "TEXT_DETECTION")
            text_lang <- text[[1]][1]
            ad_text <- paste(text[[2]][2:as.numeric(length(text[[2]])-20)], sep = " ", collapse = " ")
            vision_data <- bind_rows(c("text_lang" = text[[1]][1], 
                                       "ad_text" = paste(text[[2]][2:as.numeric(length(text[[2]])-20)], sep = " ", collapse = " ")))
            if(colnames(getGoogleVisionResponse(i, feature = "FACE_DETECTION"))[1] != "error"){
                    face <- getGoogleVisionResponse(i, feature = "FACE_DETECTION")
                    face_conf <- face$detectionConfidence
                    joy <- face$joyLikelihood
                    sorrow <- face$sorrowLikelihood
                    anger <- face$angerLikelihood
                    surprise <- face$surpriseLikelihood
                    underExposed <- face$underExposedLikelihood
                    blur <- face$blurredLikelihood
                    headwear <- face$headwearLikelihood
            } 
            if(colnames(getGoogleVisionResponse(i, feature = "LABEL_DETECTION"))[1] != "error"){
                    label <- getGoogleVisionResponse(i, feature = "LABEL_DETECTION")
                    label_desc <- label$description
                    label_score <- label$score
            }
            visual_data <- bind_rows(c("face_conf" = face_conf,
                               "joy" = joy,
                               "sorrow" = sorrow,
                               "anger" = anger, "surprise" = surprise, "underExposed" = underExposed,
                               "blur" = blur, "headwear" = headwear, "text_lang" = text_lang, "ad_text" = ad_text))
    }

【问题讨论】:

    标签: r macos function for-loop if-statement


    【解决方案1】:

    尝试使用创建list 在每次迭代中存储您的数据框:

    googlevision <- function(path) {
      path <- dirname(file.choose())  # Get directory
      setwd(path)
      pic_list <- list.files(path = path, pattern = "*.png")  # Get filename lists
      vision_data_list <- list()
      for (i in pic_list) {
        text <- getGoogleVisionResponse(i, feature = "TEXT_DETECTION")
        text_lang <- text[[1]][1]
        ad_text <- paste(text[[2]][2:as.numeric(length(text[[2]])-20)], sep = " ", collapse = " ")
        vision_data <- bind_rows(c("text_lang" = text[[1]][1], 
                                   "ad_text" = paste(text[[2]][2:as.numeric(length(text[[2]])-20)], sep = " ", collapse = " ")))
        if(colnames(getGoogleVisionResponse(i, feature = "FACE_DETECTION"))[1] != "error"){
          face <- getGoogleVisionResponse(i, feature = "FACE_DETECTION")
          face_conf <- face$detectionConfidence
          joy <- face$joyLikelihood
          sorrow <- face$sorrowLikelihood
          anger <- face$angerLikelihood
          surprise <- face$surpriseLikelihood
          underExposed <- face$underExposedLikelihood
          blur <- face$blurredLikelihood
          headwear <- face$headwearLikelihood
        } 
        if(colnames(getGoogleVisionResponse(i, feature = "LABEL_DETECTION"))[1] != "error"){
          label <- getGoogleVisionResponse(i, feature = "LABEL_DETECTION")
          label_desc <- label$description
          label_score <- label$score
        }
        visual_data <- data.frame("face_conf" = face_conf,
                                  "joy" = joy,
                                  "sorrow" = sorrow,
                                  "anger" = anger, "surprise" = surprise, "underExposed" = underExposed,
                                  "blur" = blur, "headwear" = headwear, "text_lang" = text_lang, "ad_text" = ad_text)
        vision_data_list<-c(vision_data_list,list(visual_data))
      }
      return (do.call(rbind,vision_data_list))
    }
    

    【讨论】:

    • 谢谢!我认为您使用 list() 的技巧正在奏效。但是现在它在控制台中返回绑定的结果,我试图弄清楚如何将它变成一个单独的数据框对象但是遇到了麻烦..有什么想法吗?
    • 我通过选择 for 循环成功地创建了一个数据框,这解决了我正在拍摄的任务,但仍然很高兴知道如何通过函数获取数据框。非常感谢@Jim Chen
    • 您可以将return (do.call(rbind,vision_data_list)) 修改为return (vision_data_list),这将返回一个列表,其中包含每个列表元素中的单独数据框。
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2016-09-15
    • 2012-06-01
    • 2021-08-11
    相关资源
    最近更新 更多