Я добавил реактивный объект myData
, который вы должны использовать для таблицы contents
, но что более важно для обновления вариантов в selectInput
(проверьте observe
и updateSelectInput
).
library(shiny)
ui <- shinyUI(
fluidPage(
fileInput("file1", "Choose file to upload", accept = ".rds"),
selectInput("myNames","Names", ""),
tableOutput("contents")
)
)
server <- function(input, output, session) {
myData <- reactive({
inFile <- input$file1
if (is.null(inFile)) {
d <- myDataFrame
} else {
d <- readRDS(inFile$datapath)
}
d
})
output$contents <- renderTable({
myData()
})
observe({
updateSelectInput(session, "myNames",
label = "myNames",
choices = myData()$names,
selected = myData()$names[1])
})
}
shinyApp(ui, server)
Я не делал никаких тестов, но я сильно подозреваю, что $ _SESSION [] будет всегда быть немного медленнее, чем обычные переменные для записи, потому что он поддерживается файловой системой или базой данных. Даже если все хранилище $ _SESSION [] кэшировано, все равно будет задействовано больше активности процессора и памяти, чем при использовании переменных, которые хранятся только локально. Для чтения все еще будет небольшая разница, но она будет незначительной по сравнению с другими факторами.
Таким образом, комментарий выше на деньги. У вас есть другие области оптимизации, которые важнее, чем эта.
Если вы хотите повысить производительность, подумайте о том, чтобы дублировать некоторые из ваших проверок ввода в JavaScript. (НЕ ЗАМЕНИТЕ проверку на стороне сервера, поскольку JS не является универсальной, просто рассмотрите способы, чтобы избежать необходимости, если это возможно.)
Я собираюсь сделать второй комментарий здесь, если вы собираетесь оптимизировать, вы не получите большого улучшения, исключив повторяющиеся переменные (хотя, если у вас есть огромные переменные, вы хотите устранить дублирование для сохранения памяти - не скорость). Однако, для демонстрации, я установил этот тест для тестирования:
session_start();
$hey = "THIS IS A TEST OF ACCESS SPEEDS"; //our variable
$_SESSION['hey'] = $hey; //out session variable
$hey_array = array('a'=>'random','b'=>'random','c'=>'random'); //another random array
$hey_array['hey'] = $hey;
function access_the_variable($var){
$waste_some_time = substr($var,0,10); //this could be anything
}
//GO!
$start = microtime(true);
for($i=0;$i<100000;$i++){
access_the_variable($hey);
}
$end = microtime(true);
echo "\$hey took ".($end-$start)." microseconds<br />";
$start = microtime(true);
for($i=0;$i<100000;$i++){
access_the_variable($_SESSION['hey']);
}
$end = microtime(true);
echo "\$_SESSION['hey'] took ".($end-$start)." microseconds<br />";
$start = microtime(true);
for($i=0;$i<100000;$i++){
access_the_variable($hey_array['hey']);
}
$end = microtime(true);
echo "\$hey_array['hey'] took ".($end-$start)." microseconds<br /><br />";
Результаты нескольких прогонов:
$ hey взял 0.079180002212524 микросекунды $ _SESSION [ 'hey'] взял 0.096824884414673 микросекунды $ hey_array ['hey'] взял 0.091028928756714 микросекунд
$ hey взял 0.080883026123047 микросекунды $ _SESSION ['hey'] взял 0.095050096511841 микросекунды $ hey_array ['hey'] взял 0.091977834701538 микросекунд
$ hey взял 0.081928968429565 микросекунды $ _SESSION ['hey'] взял 0.097215890884399 микросекунды $ hey_array ['hey'] взял 0.092087030410767 микросекунд
$ hey взял 0.081655979156494 микросекунды $ _SESSION ['hey'] взял 0.098057985305786 микросекунды $ hey_array ['hey'] взял 0.09247899055481 микросекунды
$ hey взял 0.081120014190674 микросекунды $ _SESSION ['hey'] взял 0.096808910369873 микросекунды $ hey_array ['hey'] взял 0.092255115509033 микросекунды
$ hey взял 0.081827878952026 микросекунды $ _SESSION ['hey'] взял 0.0961349010467 53 микросекунды $ hey_array ['hey'] взял 0.092247009277344 микросекунды
$ hey взял 0.081613063812256 микросекунды $ _SESSION ['hey'] взял 0.096814870834351 микросекунды $ hey_array ['hey'] взял 0.090691804885864 микросекунд
blockquote>Итак, в 100 000 циклов мы говорим о .01 MICROSECONDS.
Однако стоит отметить, что разность скоростей почти полностью связана с необходимостью доступа к ассоциативному массиву. Тот факт, что это суперглобал, не влияет на это (длина массива, однако, и вы начнете видеть крошечные разницы в скорости, если ваш массив SESSION станет огромным (но опять же, мы говорим о hundreths в миллионных доли секунды).
Существует незначительная разница в производительности. Когда я говорю «маргинальный», я имею в виду действительно, очень маленький. Тот факт, что это $_SESSION
массив, не имеет каких-либо характеристик подшипника. Это ассоциативный поиск массива, который занимает немного больше времени, чем доступ к переменной.