2017-01-25 13 views
0

EDITED:以下のコードがあります。基本的には、関数のデータフレームから画像を取得しています。私はforループを実行する最善の方法が何であるか、またはこれにはより良い選択肢があるかどうかは分かりません。最終目標はDF_ALLに到達することです。データフレームには100以上の画像があります。したがって、以下の解決策は最もエレガントではありません。関数付きループ用R

# Part 1, Get some profile images from Twitter. 

library(rtweet) #I'm not including the key here. 

# Get a list of IDs 
followers <- get_followers("TWITTER_HANDLE_HERE", n = 10) 

# Get the complete Twitter profile for the 10 users 
follower_profiles <- lookup_users(followers) 

# Create new variable profile_full_url for image API 
follower_profiles$profile_full_url <- gsub("normal", "400x400", follower_profiles$profile_image_url) 

# Part 2, Proceed image with API 
library(Roxford) 
visionkey = 'KEY_FROM_GOOGLE' 

# Run image tag function on the first image 
DF1 <- getTaggingResponseURL(follower_profiles$profile_full_url[1], visionkey) 
DF1$twitter_url <- follower_profiles$profile_full_url[1] 

# Here is the result (Notice how it is show 3 rows. I don't why it is. Would prefer to have 1 row per image) 
# name  confidence width height format                 twitter_url 
# tags  wall 0.999090671539307 <NA> <NA> <NA> http://pbs.twimg.com/profile_images/9999999999_400x400.jpg 
# requestId <NA>    <NA> <NA> <NA> <NA> http://pbs.twimg.com/profile_images/9999999999_400x400.jpg 
# metadata <NA>    <NA> 400 400 Jpeg http://pbs.twimg.com/profile_images/9999999999_400x400.jpg 

# The problem is... there could be 100+ of images. 
# I feel that a for loop could potentially be the solution. 

DF1 <- getTaggingResponseURL(follower_profiles$profile_full_url[1], visionkey) 
DF1$twitter_url <- follower_profiles$profile_full_url[1] 

DF2 <- getTaggingResponseURL(follower_profiles$profile_full_url[2], visionkey) 
DF2$twitter_url <- follower_profiles$profile_full_url[2] 

DF3 <- getTaggingResponseURL(follower_profiles$profile_full_url[3], visionkey) 
DF3$twitter_url <- follower_profiles$profile_full_url[3] 

DF_ALL<-rbind(DF1,DF2,DF3) 
+0

いくつかのサンプルデータを提供できますか?これは 'lapply'で簡単に解決できるようですが、あなたのデータがどのように見えるかを見ることなく、解決策を提供するのは難しいです。 – LAP

+0

次のように試してください: 'do.call(rbind、list(BOD、BOD))'に似た何か ' – Jimbou

+0

と同様に' sapply(1:5、function(x)getTaggingResponseURL(follower_profiles $ profile_full_url [x]、visionkey) //stackoverflow.com/questions/2851327/convert-a-list-of-data-frames-into-one-data-frame?noredirect=1&lq=1 – jogo

答えて

2

これを試してみてください:

for (i in 1:nrow(follower_profiles)) { 
    DF <- getTaggingResponseURL(follower_profiles$profile_full_url[i], visionkey) 
    DF$twitter_url <- follower_profiles$profile_full_url[i] 
    if (i == 1) { 
     DF_ALL <- DF 
    } else { 
     DF_ALL <- rbind(DF_ALL,DF) 
    } 
} 
+0

私はそれを使って遊びました。この機能は私の他の問題のために働くようです。この関数getTaggingResponseURL()は、イメージごとに3行を返します。しかし、この関数が実際に1行を返すと仮定しよう。私の新しい問題は、getTaggingResponseURL()は何も返さない、つまりイメージを特定できないということです。したがって、空白の行を返し、DF $ twitter_urlを返して、どのURLが失敗するかを知るようにする必要があります。 – Samuel

+0

@Samuelこれは何も「何もない」を見るために 'class(DF)'を使います。次に、別の処理を行うために 'if(DF == what_you_call_nothing)'を試してみてください。完全で再現性のある例がなければ、さらに多くのことを助けるのは難しいです。 – Rodrigo

+0

コードは今すぐ再現可能でなければなりません。 – Samuel

3

1つのURLのための機能。

foo <- function(x) { 
    DF <- getTaggingResponseURL(x, visionkey) 
    DF$twitter_url <- x 
    DF 
} 

は、ベクターfollower_profiles$profile_full_urlrbind結果にfooを適用します。

DF_ALL <- do.call(rbind, lapply(follower_profiles$profile_full_url, foo)) 

おそらくこれもうまくいくはずですが、私はデータの構造を知らないのでわかりません。

DF_ALL <- sapply(follower_profiles$profile_full_url, foo) 
+1

'do.call( 'rbind')'の代わりに 'dplyr'パッケージの' bind_rows() 'を使うこともできます。 –

+0

はい、 'data.table'の' rbindlist'です。私はこの場合に余分なパッケージをロードしたくなかった。 – djhurio

+0

この機能は私の他の問題のために働くようです。 – Samuel

関連する問題