web-dev-qa-db-fra.com

Erreur dans bind_rows_ (x, .id): l'argument 1 doit avoir des noms utilisant map_df dans purrr

J'utilise le package spotifyr pour gratter les fonctionnalités audio spotify pour chaque chanson d'albums spécifiques dans mon jeu de données. Mon problème est que mon ensemble de données se compose de certains artistes qui ne sont pas sur Spotify - donc ils ne devraient pas retourner de valeurs.

Mon problème est que lorsque je rencontre un artiste qui n'est pas sur Spotify, j'obtiens cette erreur:

Error in bind_rows_(x, .id) : Argument 1 must have names

J'ai essayé d'encapsuler la fonction dans tryCatch pour obtenir NA pour chaque colonne de la ligne problématique, mais cela ne semble pas fonctionner.

Voici un exemple de mon code (pour info, vous devez obtenir un accès API à partir du site Web de spotify pour exécuter le code spotifyr)

library(readr)
library(spotifyr)
library(dplyr)
library(purrr)

Sys.setenv(SPOTIFY_CLIENT_ID = "xxx") #xxx will be from spotify's website
Sys.setenv(SPOTIFY_CLIENT_SECRET = "xxx")
access_token <- get_spotify_access_token()

artist <- c("Eminem", "Chris Stapleton", "Brockhampton", "Big Sean, Metro Boomin")
album <- c("Revival", "From A Room: Volume 2", "SATURATION III", "Double or Nothing")
mydata <- data_frame(artist, album)

get_album_data <- function(x) {
  get_artist_audio_features(mydata$artist[x], return_closest_artist = TRUE) %>%
    filter(album_name == mydata$album[x])}

try_get_album_data <- function(x) {
  tryCatch(get_album_data(x), error = function(e) {NA})}

map_df(seq(1, 4), try_get_album_data)
10
Evan O.

Le problème est que lorsqu'il lie les lignes, il ne peut pas se lier avec NA. Pour résoudre ce problème, utilisez simplement data.frame() plutôt que NA.

Voici un exemple plus simple du problème.

library('dplyr')
library('purrr')

try_filter <- function(df) {
  tryCatch(
    df %>%
      filter(Sepal.Length == 4.6),
    error = function(e) NA)
}

map_df(
  list(iris, NA, iris),
  try_filter)
#> Error in bind_rows_(x, .id) : Argument 1 must have names

La solution consiste à remplacer NA par data.frame().

try_filter <- function(df) {
  tryCatch(
    df %>%
      filter(Sepal.Length == 4.6),
    error = function(e) data.frame())
}

map_df(
  list(iris, NA, iris),
  try_filter)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          4.6         3.1          1.5         0.2  setosa
#> 2          4.6         3.4          1.4         0.3  setosa
#> 3          4.6         3.6          1.0         0.2  setosa
#> 4          4.6         3.2          1.4         0.2  setosa
#> 5          4.6         3.1          1.5         0.2  setosa
#> 6          4.6         3.4          1.4         0.3  setosa
#> 7          4.6         3.6          1.0         0.2  setosa
#> 8          4.6         3.2          1.4         0.2  setosa
10
Paul