24

結果として行列を生成する関数を作成しましたが、この関数の出力を関数環境の外で使用できるようにする方法がわからないため、たとえば csv ファイルに保存できます。

関数の私のコードは次のとおりです。

特定のサイトから URL を取得し、ページ タイトルを返す関数を作成しました。

getTitle <- function(url) {
  webpage <- readLines(url)
  first.row <- webpage[1]
  start <- regexpr("<title>", first.row)
  end <- regexpr("</title>", first.row)
  title <- substr(first.row,start+7,end-1)
  return(title)
}

URLのベクトルを取り、URLとページタイトルを含むn * 2マトリックスを返す作成された関数:

getTitles <- function(pages) {
  my.matrix <- matrix(NA, ncol=2, nrow=nrow(pages))
  for (i in seq_along(1:nrow(pages))) {
    my.matrix[i,1] <- as.character(pages[i,])
    my.matrix[i,2] <- getTitle(as.character(pages[i,])) }
  return(my.matrix)
  print(my.matrix)}

ここからサンプルファイルでこの関数を実行した後http://goo.gl/D9lLZこれを read.csv 関数でインポートし、「mypages」という名前を付けて、次の出力を取得します。

getTitles(mypages)
     [,1]                                               [,2]                                                
[1,] "http://support.google.com/adwords/answer/1704395" "Create your first ad campaign - AdWords Help"      
[2,] "http://support.google.com/adwords/answer/1704424" "How costs are calculated in AdWords - AdWords Help"
[3,] "http://support.google.com/adwords/answer/2375470" "Organizing your account for success - AdWords Help"

これはまさに私が必要としているものですが、この出力を csv ファイルにエクスポートしたり、さらに操作するために再利用したりしたいと考えています。ただし、(my.matrix) を印刷しようとすると、「エラー: オブジェクト 'my.matrix' が見つかりません」というエラーが表示されます。

私の知識にはかなり基本的なギャップがあるように感じますが、しばらく R を使用しておらず、それを解決できませんでした。

ありがとう!セルゲイ

4

4 に答える 4

31

それは簡単です:<<-グローバルへの割り当てに使用します。

しかし、繰り返しになりますが、グローバル割り当ては悪であり、機能しません。関数からいくつかの結果を含むリストを返したいと思うかもしれません。returnコードを見ると、2 番目の関数がとを混同しているようprintです。正しいデータ構造を返すようにしてください。

于 2013-04-14T00:21:16.080 に答える
21

関数型プログラミングについて少し。まず、関数を定義するとき:

getTitles <- function(pages) {
  [...]
  return(my.matrix)
  print(my.matrix)
}

関数が呼び出されたときにprintステートメントに到達しないことを知っています。代わりに、直前に終了しreturnます。printしたがって、そのステートメントを削除できますが、それは役に立ちません。

今、より重要なもの。関数内で、 を定義して返しmy.matrixます。オブジェクトは関数のスコープ内にのみ存在します。関数が終了すると、返されるのは名前のないオブジェクトmy.matrixです (そして失われます)。

あなたのセッションで、あなたが呼び出すとき

getTitles(mypages)

割り当てていないため、結果が出力されます。代わりに、次のことを行う必要があります。

out.matrix <- getTitles(mypages)

結果は印刷されませんが、入力するか、1行print(out.matrix)だけで確実に印刷できます。out.matrixまた、結果をオブジェクトに保存したので、それをさらに操作するために再利用できるようになりました。

概念を理解するのに役立つ場合、これはc()コマンド ラインから関数を呼び出すのとまったく同じです。

c(1, 5, 2)      # will return and print a vector 
x <- c(1, 5, 2) # will return and assign a vector (not printed.)

おまけ: 本当に、 を定義する必要はないと思いますがgetTitles、関数の 1 つを使用できます*apply。私はこれを試してみます:

url    <- as.character(mypages)
title  <- sapply(url, getTitle)
report <- data.frame(url, title)
write.csv(report, file = "report.csv", row.names = FALSE)
于 2013-04-14T00:28:37.593 に答える