2015-10-23 8 views
14

y = TRUEの場合は(rstudioの場合)ビューアで何かを開き、ブラウザにはy = FALSEのいずれかの関数を考慮してください。 whateveroptions(viewer = NULL)経由でブラウザに開かせることができます(これまでにリセットする必要があります)。しかし、通常のon.exitアプローチを使用してこの機能を使用することはできません。 windowsとosxでテストされています。rstudioにビューアの代わりにブラウザを使用させる

f <- function(x, y = TRUE) { 
    if (y) { 
    oo <- getOption('viewer') 
    on.exit(options(viewer = oo)) 
    options(viewer = NULL) 
    } else options(viewer = NULL) 
    print(getOption('viewer')) 
    DT::datatable(x) 
} 

g <- function(x, y = TRUE) { 
    if (y) { 
    oo <- getOption('viewer') 
    on.exit(options(viewer = oo)) 
    options(viewer = NULL) 
    } else options(viewer = NULL) 
    print(getOption('viewer')) 
    htmlTable::htmlTable(x) 
} 

## in rstudio, returns the viewer function 
getOption('viewer') 
# function (url, height = NULL) 
# ... 

## opens in viewer despite `options(viewer = NULL)` 
g(mtcars) 
# NULL 

## again returns the function, ie, reset my options to before g call successfully 
getOption('viewer') 
# function (url, height = NULL) 
# ... 

## opens in browser but leaves `options(viewer = NULL)` after exiting 
g(mtcars, FALSE) 
# NULL 

getOption('viewer') 
# NULL 

視聴者はほんの一部のHTML(g)またはウィジェット(f)のいずれかで機能環境の中で私のオプションを尊重していないように思えます。私は両方とも関数内でviewer = NULLを使用し、終了時の方法で自分のオプションを返して、結果を表示する場所を制御できるようにすると考えました。

または、これをHTMLとウィジェットの両方で行うより良い方法はありますか?私はDT::datatableoptions引数を無駄にしようとしましたが、これはhtmlTable::htmlTableの場合には役に立ちません。

私が考えることのできる唯一のアプローチは、すべてのコードを一時ファイルに書き込むことです。if (rstudio) rstudio::viewer(tempfile) else browseURL(tempfile)と思っているようです。

+1

余分なポイント誰かが私の編集履歴を見て、diffは私はUsheyに「バットシグナル」まで送っ – rawr

+1

2つの異なる方法で同じ文字を削除知っているどのように私に言うことができるかどうか。うまくいけば、彼はシアトルの雲を見ているでしょう。 – hrbrmstr

答えて

9

これは修正ではありませんが、何が起こっているかを示していると思います。 on.exit()ハンドラでSys.sleep()の呼び出しを追加してみてください:

f <- function(x) { 
    viewer <- getOption("viewer") 
    on.exit({ 
    print("Restoring viewer...") 
    Sys.sleep(3) 
    options(viewer = viewer) 
    }, add = TRUE) 
    options(viewer = NULL) 
    DT::datatable(x) 
} 

## opens in viewer despite `options(viewer = NULL)` 
f(mtcars) 

あなたはRStudioはon.exit()ハンドラの実行が完了するまでDT::datatable()呼び出しの結果をどうするかを「決定」しないことに気づくでしょう。これは、RStudioが結果との関係を把握したいときには、視聴者が既に復元されていることを意味します。確かに、RStudioは、結果のコンテンツの表示方法を決定するためにRがもうビジーでなくなるまで待っています。そして、遅すぎてviewerオプションの一時的な変更ができません。

これは、htmlTableの動作を説明していないことに注意してください。私の最高の推測は、何らかの競合状態が続いていることです。我々はもちろんのRStudio、でこれを処理するために把握することができない限り - 失われたviewerオプションは

は残念ながら、この問題を回避作業するon.exit()コールの使用を避けることを意味します...戦略的に配置されたSys.sleep()呼び出しで離れて行くように思われます。

5

コードをテンポラリファイルに書き込んで、browseURLなどの任意のコードを使用してこの機能を利用できる方法の1つです。

fgの両方の要点は同じです。したがって、私が想定しているすべてのタイプのHTMLコードまたはウィジェットを処理する関数を1つ持つことができます。おそらくウィジェットはselfcontained = TRUEである必要があります。

f <- function(x, y = TRUE) { 
    x <- if ((inherits(x, 'iplot'))) x else DT::datatable(x) 
    if (!y) { 
    htmlFile <- tempfile(fileext = '.html') 
    htmlwidgets::saveWidget(x, htmlFile, selfcontained = TRUE) 
    utils::browseURL(htmlFile) 
    } else x 
} 

g <- function(x, y = TRUE) { 
    x <- htmlTable::htmlTable(x) 
    if (!y) { 
    htmlFile <- tempfile(fileext = '.html') 
    writeLines(x, con = htmlFile) 
    utils::browseURL(htmlFile) 
    } else x 
} 

## opens in viewer 
g(mtcars) 
## opens in browser 
g(mtcars, FALSE) 

## same for widgets 
f(mtcars) 
f(mtcars, FALSE) 

f(qtlcharts::iplot(1:5, 1:5), FALSE) 

## and my options haven't changed 
getOption('viewer') 
# function (url, height = NULL) 
# ... 

これは実際には異なるビューアを使用htmlTable::htmlTable持っている適切な方法ですが、gは、任意のHTMLのために働くべきだとサイドノート。

library('htmlTable') 
print(htmlTable(mtcars), useViewer = utils::browseURL) 
関連する問題