Рассмотрим любую функцию, которая (для rstudio) откроет что-то в средстве просмотра, если y = TRUE и в вашем браузере, если y = FALSE. Вы можете заставить whatever открываться в вашем браузере с помощью options(viewer = NULL) (а затем вам нужно reset раньше), но я не могу заставить это работать внутри функций, используя обычный подход on.exit. Протестировано на окнах и osx.
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, так и для виджетов? Я пробовал аргумент options в DT::datatable безрезультатно, но это не помогло бы для случая htmlTable::htmlTable.
Единственный другой подход, о котором я могу думать, - написать весь код в временном файле и использовать if (rstudio) rstudio::viewer(tempfile) else browseURL(tempfile), который, по моему мнению, является большой работой для чего-то вроде бы такого прямолинейного.