2010-11-26 31 views
1

Je suis en train de mettre à jour un projet que j'avais précédemment. Ce code a fonctionné il y a quelques mois, en attendant j'ai amélioré R et plyr. Je pense que j'étais sur R1.10 et maintenant je suis sur R1.35, je ne suis pas sûr de la version de plyr que je courais avant mais ma version installée actuelle est de 1.2.Question sur l'erreur Plyr: Erreur dans as.double (y): ne peut pas forcer le type 'S4' à un vecteur de type 'double'

Voici ce que je suis en train de courir:

library(plyr) 
library(twitteR) 

tw <- head(ldply(searchTwitter("rstats", session=getCurlHandle(), n=10), function(x) data.frame(text=text(x), favorited=favorited(x), created=created(x), truncated=truncated(x), id=id(x), statusSource=statusSource(x), screenName=screenName(x)))) 

Je reçois toujours le même message d'erreur maintenant.

Error in as.double(y) : 
    cannot coerce type 'S4' to vector of type 'double' 

Tout conseil serait apprécié.

Merci,

Jason

Répondre

4

Dans votre milieu de confusion sur ce que les versions que vous utilisez (il n'y avait pas une version R 1.35 !!), il y a plusieurs problèmes. (Pour connaître les versions de R et de packages que vous exécutez, essayez sessionInfo().)

D'abord, l'erreur que vous obtenez vient de votre utilisation de text(). Il devrait être statusText(). Deuxièmement, il semble que certaines des fonctions/méthodes ne sont pas exportées dans le paquet NAMESPACE. Vous pouvez le faire fonctionner en spécifiant l'espace de noms correct lors de l'appel de la fonction, comme dans l'exemple ci-dessous, mais vous devez envoyer un courriel au responsable du paquet (Jeff Gentry - coordonnées CRAN). Vous pouvez vous référer à des fonctions non exportées en utilisant l'opérateur :::. ::: prend le paquet/nom d'espace de noms sur le côté gauche, avec le nom de la fonction sur le côté droit, par exemple:

twitteR:::statusSource(x) 

Voici une version de travail complète de votre exemple:

library(plyr) 
library(twitteR) 
## simplify the call to see what is going on - function first 
fooFun <- function(x) { 
    data.frame(text = statusText(x), favorited=favorited(x), 
       created=created(x), truncated=twitteR:::truncated(x), 
       id=id(x), statusSource=twitteR:::statusSource(x), 
       screenName=screenName(x)) 
} 
## now ldply it 
out <- ldply(searchTwitter("rstats", session = getCurlHandle(), n = 10), fooFun) 
## show some of it: 
head(out) 
+0

ah, oui. C'était R.app GUI v1.35 et R version 2.12. – analyticsPierce

+0

Merci d'avoir mis cet exemple ensemble, j'ai beaucoup appris et cela a définitivement résolu mon problème. – analyticsPierce

+0

Salut, je l'ai dit à Gavin en privé, mais juste sur un forum public, c'était un oubli de ma part. J'ai mis à jour le paquet pour exporter ces méthodes. Il pourrait être un jour ou deux avant que je puisse télécharger le paquet, mais la nouvelle version sera 0.9.2. Désolé pour ça. – geoffjentry

1

Cela fonctionne dans la version actuelle de la R (2.12.0) et la version 0.91 de TWITTER:

tw <- ldply(searchTwitter("rstats", session=getCurlHandle(), n=10), 
       function(x) c([email protected], [email protected], [email protected], 
          [email protected], [email protected], [email protected], 
          [email protected]) 
         ) 

Je recevais la même erreur que vous étiez jusqu'à ce que je suis passé à l'opérateur « @ » pour une ccessant les valeurs de slot.

+0

DWin, merci pour votre réponse. C'était utile. – analyticsPierce

+0

Chaque fois que je vois du code plonger dans des objets avec $ 'et' @ ', je suis obligé de lancer un petit avertissement ;-) Il ne fait probablement aucune différence, dans ce cas, d'utiliser' @ 'et de saisir les bits que vous voulez . Mais comme un cas d'utilisation générale, je pense que c'est * mauvais *. Si des fonctions d'extraction sont disponibles, les utilisateurs devraient être encouragés à les utiliser. Il y a des cas où ce qui est stocké dans un objet sous un nom particulier peut ne pas être ce que l'utilisateur attend (travail, pas réels, résidus par exemple avec certains modèles). 99 fois sur 100, tout ira bien, mais cette fois, vous pourriez bien vous faire mordre le cul. –

+0

@ Gavin: Pas de désaccord.Ce n'est qu'après avoir essayé la méthode utilisée par l'OP, sans réussir à faire fonctionner text (x) et en regardant la documentation pour cette classe S4 particulier que j'ai basculé. –