2014-12-16 4 views
7

Chcę wygenerować podzielony diagram. W górnej części wykresu należy zastosować wartości z grupy a, a niższe wartości z grupy b. W tym celu używam data.table(). Oto kod I używany do generowania przykładowy i skonfigurować wyjście graficzny:Wartości niewłaściwej grupy są używane podczas korzystania z plotowania() w ciągu data.table() w RStudio

library(data.table) 
set.seed(23) 
Example <- data.table('group' = rep(c('a', 'b'), each = 5), 'value' = runif(10)) 
layout(1:2) 
par('mai' = rep(.5, 4)) 

Uruchamiając następujące linie w zwykłej konsoli r poprawne wartości są wykorzystywane do kreślenia. Kiedy działa ten sam kod Rstudio wartości w drugiej grupie stosuje się do obu diagramach:

Example[, plot(value, ylim = c(0, 1)), by = group] # Example 1 
Example[, .SD[plot(value, ylim = c(0, 1))], by = group] # Example 2 

Dodając przecinek w podgrupie data.table .SD[] przykładu 2. Poprawne dane wyjściowe wytwarza się in Rstudio także:

Example[, .SD[, plot(value, ylim = c(0, 1))], by = group] # Example 3 

Podczas korzystania barplot() zamiast plot() Rstudio używa prawidłowych wartości, a także:

Example[, barplot(value, ylim = c(0, 1)), by = group] # Example 4 

Czy przeoczyłem coś lub jest to błąd?

System: Windows 7, v0.98.1091 Rstudio Desktop, R 3.1.2, data.table 1.9.4

+0

Wszystkie wykresy są generowane poprawnie w mojej konfiguracji: Rstudio 0.98.1028, R 3.0.2. – Steven

Odpowiedz

7

Nicea catch (+1 od już!) W moim przypadku przykład 3 nie generuje również prawidłowego wykresu (OS X 10.10.1, R 3.1.2, Rstudio 0.98.1091).

Jedyna różnica między konsolą/GUI R a Rstudio to urządzenie drukujące. Wydaje się, że RStudio używa natywnego urządzenia graficznego RstudioGD, gdzie jako konsola R/GUI używa Quartz.

Po debugowaniu graphics:::plot.default udało mi się zawęzić problem do funkcji plot.xy(). Ta funkcja wywołuje różne urządzenia graficzne (jak pokazano powyżej).

Inicjując na przykład Quartz, wywołując funkcję quartz(), a następnie uruchamiając swój kod działa poprawnie!

FWIW ten problem może być powielana używając dplyr() także:

require(dplyr) 
df = as.data.frame(Example) 
my_fun = function(x) {plot(x, ylim=c(0,1)); 1L } 
df %>% group_by(group) %>% summarise(my_fun(value)) 

spowoduje tym samym złym działki.

Jest to najprawdopodobniej ze względu na sposób podgrupy są obsługiwane w data.table (i myślę dplyr powinien robić to w taki sam sposób jak data.table), które można zobaczyć przez:

Example[, print(sapply(.SD, address)), by=group] 
#   value 
# "0x105bbf5b8" 
#   value 
# "0x105bbf5b8" 
# Empty data.table (0 rows) of 1 col: group 

data.table przypisuje największą grupę dla .SD i wewnętrznie wykorzystuje tę pamięć dla każdej podgrupy, aby uniknąć powtarzania alokacji pamięci/dealloc - dla wydajności. Nie jestem pewien (strzelanie w ciemności), ale wygląda na to, że RstudioGD nie puszcza wskaźnika powiązanego z podgrupą, a ponieważ dane w podgrupie są aktualizowane, wykres również zostaje zaktualizowany. Możesz to sprawdzić, wykonując:

# on RstudioGD 
debug(graphics:::plot.default) 
set.seed(23) 
Example <- data.table('group' = rep(c('a', 'b'), each = 5), 'value' = runif(10)) 
layout(1:2) 
par('mai' = rep(.5, 4)) 
Example[, plot(value, ylim = c(0, 1)), by = group] # Example 1 
undebug(graphics:::plot.default) 

Kontynuuj uderzanie klawisza Enter, a zobaczysz, że pierwszy wątek jest wykreślany poprawnie ..a po dodaniu drugiego wykresu zmienia się również pierwszy wykres. Może to być konsekwencja ostatnich zmian w Rv3.1 +, które argumenty funkcji płytkich kopii, a nie głębokie kopiowanie (ponownie, strzelanie w ciemności tutaj).

Można tymczasowo rozwiązać ten problem poprzez wyraźne kopiowanie value:

Example[, plot(copy(value), ylim = c(0, 1)), by = group] # Example 1 

będzie produkować odpowiednią działkę.

+1

Bardzo dziękuję za wyczerpującą odpowiedź i podpowiedź użycia funkcji copy(). Wygląda to jak najprostsza naprawa w tej chwili. – Jonas

+0

Jeśli to może być pomocne, jeśli uruchomię Przykład 1 lub 2 z konsoli, otrzymam prawidłowy wykres, jak powiedział Jonas, ale jeśli następnie wydrukuję działkę lub skopiuję jako metaplik i wkleję (np. Słowo) Dostaję wadliwą fabułę. Copy-as-bitmap nie robi tego. Na koniec spróbuj przykładu bez ylim = c (0,1). Podczas drukowania lub kopiowania uzyskuję odpowiedni zakres y dla każdego wykresu, ale powtarzające się ostatnie dane - przesunięte częściowo poza skalą na pierwszym wykresie. – DaveTurek

+0

Windows 7, R 3.1.2, data.table 1.9.4 – DaveTurek

Powiązane problemy