首页 > 解决方案 > 来自 Argo 的温度和盐度数据,但出现错误 $ 运算符对原子向量无效

问题描述

我正在尝试从 Argovis 网站“ https://argovis.colorado.edu/selection/profiles/ ”中提取温度和盐度数据,以对渔获量进行建模分析。我使用了“ https://www.itsonlyamodel.us/argovis-r-api.html ”中的代码,专门用于提取不同海洋深度剖面的温度和盐度。

    library(httr)
options(warn=-1)

get.profile <- function(profileName){
  baseURL <- "https://argovis.colorado.edu/catalog/profiles/"
  url <- paste(baseURL, profileName, sep="")
  resp <- GET(url)
  if(resp$status_code==200) {
    profile = content(resp, "parsed")
  }
  else {
    profile = profile = content(resp, "raw")
  }
  return(profile)
}

parse.into.df <- function(profile) {
  paramNames <- names(profile)
  meas <- profile$measurements
  names = unique(names(unlist(meas)))
  df <- data.frame(matrix(unlist(meas), nrow=length(meas), byrow=T))
  colnames(df) <- names
  df$profile_id <- profile$`_id`
  df$date <- profile$date
  df$cycle_number <- profile$cycle_number
  df$lat <- profile$lat
  df$lon <- profile$lon
  return (df)
}
profileName = "3900737_279"
profile = get.profile(profileName)
df = parse.into.df(profile)
head(df)

get.platform <- function(platformNumber){
  baseURL <- "https://argovis.colorado.edu/catalog/platforms/"
  url <- paste(baseURL, platformNumber, sep="")
  resp <- GET(url)
  if(resp$status_code==200) {
    profiles <- content(resp, "parsed")
  }
  else {
    profiles = content(resp, "raw")
  }
  return(profiles)
}
platformNumber <- '3900737'
platformProfiles <- get.platform(platformNumber)

platformDf <- data.frame()
for (profile in platformProfiles)
{
  df <- parse.into.df(profile)
  platformDf <- rbind(platformDf, df)
}
tail(platformDf)

get.selection <- function(startDate, endDate, shape, presRange){
  baseURL <- "https://argovis.colorado.edu/selection/profiles/"
  startDateQuery <- paste('?startDate=', startDate, sep="")
  endDateQuery <- paste('&endDate;=', endDate, sep="")
  shapeQuery <- paste('&shape;=', shape, sep="")

  if(missing(presRange)) {
    url <- paste(baseURL, startDateQuery, endDateQuery, shapeQuery, sep="")
  }
  else {
    presRangeQuery = paste('&presRange;=', presRange, sep="")
    url <- paste(baseURL, startDateQuery, endDateQuery, presRangeQuery, shapeQuery, sep="")   
  }
  resp <- GET(url)
  if(resp$status_code==200) {
    profiles <- content(resp, "parsed")
  }
  else {
    profiles <- content(resp, "raw")
  }
  return(profiles)
}
startDate='2017-9-15'
endDate='2017-10-31'
shape = '[[[-18.6,31.7],[-18.6,37.7],[-5.9,37.7],[-5.9,31.7],[-18.6,31.7]]]'
presRange='[0,30]'

selectionProfiles = get.selection(startDate, endDate, shape, presRange)
selectionDf <- data.frame()
for (profile in selectionProfiles)
{
  df <- parse.into.df(profile)
  selectionDf <- rbind(selectionDf, df)
}

但是当我到达最后一步时我得到的是:

错误:$ 运算符对原子向量无效

请你帮助我好吗

标签: rcloudflare-argo

解决方案


您的问题来自第 22 行:

df$profile_id <- profile$`_id`

应该是:

df$profile_id <- profile$_id

也许这个修复不起作用,因为我真的不知道profiles对象包含什么。

但是您的问题源于尝试使用 $ 调用作为参考的原子向量( vector with length = 1"_id"


推荐阅读