2016-06-06 9 views
6

Czy widzisz sposób na wykonanie obliczenia w R podczas oczekiwania na dane wejściowe użytkownika?R: Uruchamianie obliczeń podczas oczekiwania na wprowadzenie użytkownika

Piszę skrypt, który tworzy różne rodzaje wykresów, które są zdefiniowane przez dane wejściowe użytkownika, ale w pierwszej partii danych musi być załadowany i przetworzony. Ale w rzeczywistości użytkownik może zacząć definiować, co chce już podczas przetwarzania - to jest to, co chciałbym zrobić!

Myślę, że pakiet RDSn może zapewnić funkcjonalność, której potrzebuję, ale nie byłem w stanie wymyślić, w jaki sposób.

Dzięki!

Odpowiedz

0

Nie podałeś mi zbyt wiele kontekstu, ani odtwarzalnego kodu, więc podam prosty przykład. Nie jestem zaznajomiony z pakietem Rdsn, więc użyję dostarczenia rozwiązania, które znam.

# create a function to prompt the user for some input 
readstuff = function(){ 
    stuff = readline(prompt = "Enter some stuff: ") 
    # Here is where you set the condition for the parameter 
    # Let's say you want it to be an integer 
    stuff = as.integer(stuff) 
    if(is.na(stuff)){ 
    return(readstuff()) 
    } else { 
    return(stuff) 
    } 
} 

parameter = readstuff() 

print(parameter) 
print(parameter + 10) 

Kluczem tutaj jest „źródłem” skrypt zamiast „działa” go. Możesz znaleźć przycisk "źródło" w prawym górnym rogu RStudio. Możesz także użyć source(yourscript), aby go pobrać.

Tak więc dla każdego parametru, który chcesz monitować użytkownika o wprowadzenie, po prostu zadzwoń readstuff(). Możesz też nieco go poprawić, aby był bardziej ogólny. Na przykład:

# create a function to prompt the user for some input 
readstuff = function(promptMessage = "stuff", class = "integer"){ 
    stuff = readline(prompt = paste("Enter the", promptMessage, ": ")) 
    # Here is where you set the condition for the parameter 
    # Let's say you want it to be an integer 
    stuff = as(stuff, class) 
    if(is.na(stuff)){ 
    return(readstuff(promptMessage, class)) 
    } else { 
    return(stuff) 
    } 
} 

plotColor = readstuff("plot color", "character") 
size = readstuff("size parameter") 
xvarName = readstuff("x axis name", "character") 

df = data.frame(x = 1:100, y = 1:100) 

library(ggplot2) 
p = ggplot(df, aes(x = x, y = y, size = size, color = plotColor)) + 
    labs(x = xvarName) + geom_point() 
print(p) 

W if(is.na(stuff)) oświadczenia nie będzie działać, jeśli klasa ma charakter, ale nie będę się w szczegóły, jak to naprawić, ponieważ kwestia ta jest głównie o tym, jak czekać na wejście użytkownika. Istnieją również sposoby, aby ukryć komunikaty ostrzegawcze, jeśli użytkownik wprowadził coś innego niż zamierzony, ale znowu nieco poza tematem, aby o tym tutaj mówić.

Jedną z ważnych rzeczy, na które należy zwrócić uwagę, jest to, że wszystko, co R ma zostać wydrukowane lub wydrukowane, należy opakować za pomocą funkcji print(). W przeciwnym razie pozyskanie go nie spowoduje drukowania ani drukowania niczego. Ponadto, wpisując parametr, który ma być łańcuchem lub znakiem, nie dodawaj cudzysłowów. Na przykład dla plotColor, w linii poleceń wpisz czerwony zamiast "czerwony".

Większość kodu readline są odniesione od here:

+0

No nie jest to, co chciałem wiedzieć. Myślałem o sytuacji takiej jak ta: etykieta <-readline ("Powiedz mi, co chcesz być tym małym") Pytanie #ask użytkownika, które wymaga dużo myślenia data.raw <-read.table (...) #read masywny plik data.processed <-do.something (data.raw) #do czas wymagający wykres przetwarzania (data.processed, main = label) #plot dane z parametrem określonym przez użytkownika na początku 'Więc chcę, aby czytanie i przetwarzanie rozpoczyna się natychmiast, aby użytkownik nie został zwolniony przez decyzję o tym, co chce, aby działka zostało oznaczone. –

+0

@MichalSvoboda Cóż, czy użytkownik musi również podać własne dane? lub czy "ogromny plik" jest już uwzględniony? – useR

+0

Chodzi o to, że program najpierw ładuje jakiś duży plik ze wszystkimi danymi, a następnie użytkownik wybiera jakiś podzbiór tego, z którego chce wygenerować raport. Plik nie jest dobrze zorganizowany i wymaga dużo przetwarzania, ale to właśnie mamy - myślałem, że użytkownik może rozpocząć określanie podzbioru przed zakończeniem przetwarzania. Użytkownik nie musi określać ścieżki do pliku ani niczego, ponieważ plik jest taki sam, ale jest stale aktualizowany przez system gromadzenia danych. –

Powiązane problemy