2015-10-23 9 views
14

और y = FALSE पर अपने ब्राउज़र में यदि दर्शक (रेस्ट्यूडियो) दर्शक में कुछ खोल देगा तो विचार करें। options(viewer = NULL) (और फिर आपको पहले रीसेट करने की आवश्यकता है) के माध्यम से अपने ब्राउज़र में खोलने के लिए whatever को मजबूर कर सकते हैं, लेकिन मैं इसे सामान्य on.exit दृष्टिकोण का उपयोग करके कार्यों के अंदर काम करने के लिए नहीं मिल सकता। विंडोज़ और ओएसएक्स पर परीक्षण किया।दर्शक के बजाय ब्राउज़र का उपयोग करने के लिए बल 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 का उपयोग करेंगे और मेरे विकल्पों को बाहर निकलने के तरीके को वापस कर देंगे ताकि मैं नियंत्रित कर सकूं कि मैं परिणाम कहां देखना चाहता हूं।

या एचटीएमएल और विजेट दोनों के लिए ऐसा करने का एक बेहतर तरीका है? मैंने में options तर्क का कोई फायदा नहीं लिया है, लेकिन इससे htmlTable::htmlTable मामले में मदद नहीं मिलेगी।

एकमात्र अन्य दृष्टिकोण जो मैं सोच सकता हूं वह सभी कोड को एक temp फ़ाइल में लिखना है और if (rstudio) rstudio::viewer(tempfile) else browseURL(tempfile) का उपयोग करना है जो मुझे लगता है कि कुछ ऐसा लगता है जो सीधे आगे बढ़ता है।

+1

अतिरिक्त अंक अगर किसी को मेरी संपादन इतिहास को देखो और मुझे बताओ कि diff जानता है कि मैं दो अलग अलग तरीकों – rawr

+1

मैं Ushey करने के लिए "चमगादड़ सिग्नल" भेजा में एक ही अक्षर के नष्ट कर दिया जा सकता है। उम्मीद है कि वह सिएटल में बादलों को देख रहा है। – 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 प्रतीक्षा करता है जब तक कि परिणामस्वरूप सामग्री को प्रदर्शित करने का निर्णय लेने के लिए आर 'व्यस्त' नहीं है, और तब तक viewer विकल्प में अस्थायी परिवर्तनों के लिए बहुत देर हो चुकी है।

ध्यान दें कि यह htmlTable व्यवहार की व्याख्या नहीं करता है। मेरा सबसे अच्छा अनुमान यह है कि किसी प्रकार की दौड़ की स्थिति चल रही है; खो viewer विकल्प के साथ रणनीतिक Sys.sleep() कॉल ... रखा दूर जाने लगता है

दुर्भाग्य से, इस के आसपास काम कर on.exit() कॉल का उपयोग न मतलब है - जब तक कि हम निश्चित रूप से, RStudio में इस संभाल करने के लिए यह पता लगाने कर सकते हैं।

5

यहां एक तरीका है कि आप इस कार्यक्षमता को अस्थायी फ़ाइल में कोड लिखकर और browseURL या जो चाहें उसका उपयोग करके प्राप्त कर सकते हैं।

f और g दोनों का सारांश समान है, इसलिए आपके पास किसी भी प्रकार के HTML कोड या विजेट को संभालने के लिए एक फ़ंक्शन हो सकता है। और शायद विजेट को 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) 
संबंधित मुद्दे