Pytanie Jak stworzyć wspaniały powtarzalny przykład R?


Omawiając wydajność ze współpracownikami, ucząc, wysyłając raport o błędzie lub szukając wskazówek na listach mailingowych i tutaj na SO, a powtarzalny przykład jest często zadawane i zawsze pomocne.

Jakie są Twoje wskazówki dotyczące tworzenia doskonałego przykładu? W jaki sposób wklejasz struktury danych z  w formacie tekstowym? Jakie inne informacje powinieneś dołączyć?

Czy oprócz używania są inne sztuczki? dput(), dump() lub structure()? Kiedy należy dołączyć library() lub require() sprawozdania? Które zastrzeżone słowa należy unikać, oprócz c, df, dataitp.?

Jak się świetnie robi  powtarzalny przykład?


2381


pochodzenie


Jestem zdezorientowany co do zakresu pytania. Wydaje się, że ludzie przeskoczyli interpretację powtarzalnego przykładu, zadając pytania na temat SO lub R-help (jak "odtworzyć błąd"). A co z powtarzalnymi przykładami R na stronach pomocy? W prezentacjach pakietów? W samouczkach / prezentacjach? - baptiste
@baptiste: To samo pomija błąd. Wszystkie wyjaśnione przeze mnie techniki są używane na stronach pomocy dotyczących pakietów oraz w samouczkach i prezentacjach, które opowiadam o R - Joris Meys
Dane są czasem czynnikiem ograniczającym, ponieważ struktura może być zbyt złożona, aby ją symulować. Aby utworzyć publiczne dane z prywatnych danych: stackoverflow.com/a/10458688/742447 w stackoverflow.com/questions/10454973/... - Etienne Low-Décarie


Odpowiedzi:


Minimalnie odtwarzalny przykład składa się z następujących elementów:

  • minimalny zbiór danych, niezbędny do odtworzenia błędu
  • minimalny działający kod niezbędny do odtworzenia błędu, który można uruchomić na danym zbiorze danych.
  • niezbędne informacje na temat używanych pakietów, wersji R i systemu, na którym jest uruchamiany.
  • w przypadku procesów losowych nasiona (ustawione przez set.seed()) dla odtwarzalności

Przeglądanie przykładów w plikach pomocy używanych funkcji jest często pomocne. Ogólnie rzecz biorąc, cały podany tam kod spełnia wymagania minimalnego odtwarzalnego przykładu: dane są dostarczane, minimalny kod jest zapewniony i wszystko działa.

Tworzenie minimalnego zestawu danych

W większości przypadków można to łatwo zrobić przez podanie ramki wektor / danych z pewnymi wartościami. Lub możesz użyć jednego z wbudowanych zestawów danych, które są dostarczane z większością pakietów.
Można zobaczyć pełną listę wbudowanych zestawów danych library(help = "datasets"). Każdy zestaw danych zawiera krótki opis, a więcej informacji można uzyskać na przykład za pomocą ?mtcars gdzie "mtcars" jest jednym z zestawów danych na liście. Inne pakiety mogą zawierać dodatkowe zestawy danych.

Tworzenie wektora jest łatwe. Czasem konieczne jest dodanie do niej losowości, a do tego jest cała masa funkcji. sample() może losować wektor lub podać losowy wektor z tylko kilkoma wartościami. letters jest użytecznym wektorem zawierającym alfabet. Można to wykorzystać do tworzenia czynników.

Kilka przykładów:

  • losowe wartości: x <- rnorm(10) do normalnej dystrybucji, x <- runif(10) dla jednolitej dystrybucji, ...
  • permutacja niektórych wartości: x <- sample(1:10) dla wektora 1:10 w losowej kolejności.
  • czynnik losowy: x <- sample(letters[1:4], 20, replace = TRUE)

W przypadku macierzy można użyć matrix(), np .:

matrix(1:10, ncol = 2)

Tworzenie ramek danych można wykonać za pomocą data.frame(). Należy zwrócić uwagę na nazwy wpisów w ramce danych i nie nadużywać jej zbytnio.

Przykład :

set.seed(1)
Data <- data.frame(
    X = sample(1:10),
    Y = sample(c("yes", "no"), 10, replace = TRUE)
)

W przypadku niektórych pytań mogą być potrzebne określone formaty. W tym celu można użyć dowolnego z dostarczonych as.someType Funkcje : as.factor, as.Date, as.xts, ... Te w połączeniu z trikami wektorowymi i / lub ramkami danych.

Skopiuj swoje dane

Jeśli dysponujesz danymi, które byłyby zbyt trudne do skonstruowania za pomocą tych wskazówek, zawsze możesz utworzyć podzestaw oryginalnych danych, używając np. head(), subset()lub wskaźniki. Następnie użyj np. dput() aby dać nam coś, co można umieścić w R natychmiast:

> dput(head(iris,4))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5, 
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2, 
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = c("setosa", 
"versicolor", "virginica"), class = "factor")), .Names = c("Sepal.Length", 
"Sepal.Width", "Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

Jeśli twoja ramka danych ma współczynnik z wieloma poziomami, to dput Dane wyjściowe mogą być nieporęczne, ponieważ nadal będą zawierać listę wszystkich możliwych poziomów czynników, nawet jeśli nie są obecne w podzbiorze danych. Aby rozwiązać ten problem, możesz skorzystać z droplevels() funkcjonować. Zauważ poniżej, jak gatunki są czynnikiem tylko z jednym poziomem:

> dput(droplevels(head(iris, 4)))
structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6), Sepal.Width = c(3.5, 
3, 3.2, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5), Petal.Width = c(0.2, 
0.2, 0.2, 0.2), Species = structure(c(1L, 1L, 1L, 1L), .Label = "setosa",
class = "factor")), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
4L), class = "data.frame")

Jeszcze jedno zastrzeżenie dla dput jest to, że nie zadziała w przypadku klucza data.table obiekty lub zgrupowane tbl_df (klasa grouped_df) od dplyr. W takich przypadkach można przekonwertować z powrotem na zwykłą ramkę danych przed udostępnieniem, dput(as.data.frame(my_data)).

W najgorszym przypadku możesz podać tekst, który można odczytać przy użyciu text parametr z read.table :

zz <- "Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa"

Data <- read.table(text=zz, header = TRUE)

Tworzenie minimalnego kodu

To powinno być łatwe, ale często nie jest. Czego nie powinieneś robić, to:

  • dodaj wszystkie rodzaje konwersji danych. Upewnij się, że podane dane są już w poprawnym formacie (chyba, że ​​to jest oczywiście problem)
  • kopiuj i wklej całą funkcję / fragment kodu, który powoduje błąd. Najpierw spróbuj zlokalizować, które linie dokładnie powodują błąd. Częściej niż nie dowiesz się, czym jest problem.

Co powinieneś zrobić, to:

  • dodaj, które pakiety powinny być używane, jeśli używasz jakiegokolwiek (używając library())
  • jeśli otwierasz połączenia lub tworzysz pliki, dodaj kod do ich zamknięcia lub usuń pliki (używając unlink())
  • jeśli zmienisz opcje, upewnij się, że kod zawiera instrukcję, aby przywrócić je do oryginalnych. (na przykład op <- par(mfrow=c(1,2)) ...some code... par(op) )
  • przetestuj swój kod w nowej, pustej sesji R, aby upewnić się, że kod jest możliwy do uruchomienia. Ludzie powinni po prostu skopiować i wkleić swoje dane i kod w konsoli i uzyskać dokładnie to samo, co Ty.

Podaj dodatkowe informacje

W większości przypadków wystarczy wersja R i system operacyjny. Gdy pojawiają się konflikty z pakietami, dając wynik sessionInfo() może naprawdę pomóc. Mówiąc o połączeniach z innymi aplikacjami (czy to poprzez ODBC czy cokolwiek innego), należy również podać numery wersji dla tych, a jeśli to możliwe również niezbędne informacje na temat konfiguracji.

Jeśli używasz R w R Studio za pomocą rstudioapi::versionInfo() może być pomocna w zgłoszeniu wersji RStudio.

Jeśli masz problem z określonym pakietem, możesz chcieć podać wersję pakietu, podając wynik packageVersion("name of the package").


1454



Jak korzystać dput jeśli ramka danych jest bardzo duża, a problem jest generowany przez środek ramki danych? Czy istnieje sposób użycia dput aby odtworzyć środkową część danych, powiedzmy wiersze od 60 do 70? - BgnR
@BgnR Możesz wyodrębnić część ramki danych za pomocą indeksów, np .: tmp <- mydf[50:70,] śledzony przez dput(mydf). Jeśli ramka danych jest naprawdę duża, spróbuj wyizolować problem i po prostu prześlij kilka linii, które powodują problem. - Joris Meys
@JorisMeys: Czy istnieje sposób, aby powiedzieć head lub dput ograniczyć dane do poziomu N rekursywnie? Próbuję wymyślić powtarzalny przykład, a moje dane to lista ramek danych. Więc, dput(head(myDataObj)) wydaje się nie być wystarczającym, ponieważ generuje plik wyjściowy o wielkości 14 MB. - Aleksandr Blekh
@JorisMeys: Tylko FYI - zamieszczone pytanie w komentarzu powyżej jako osobne pytanie: stackoverflow.com/questions/25127026/.... - Aleksandr Blekh
@Konrad Najlepszą rzeczą, jaką możesz zrobić, jest link do pliku i podanie minimalnego polecenia do odczytu w tym pliku. Będzie to mniej kłopotliwe niż kopiowanie wklejania danych wyjściowych dput () :) - Joris Meys


(Oto moja rada od Jak napisać powtarzalny przykład . Próbowałem zrobić to krótko, ale słodko)

Jak napisać powtarzalny przykład.

Jeśli dostarczysz powtarzalny przykład, najprawdopodobniej uzyskasz pomoc dotyczącą problemu R. Powtarzalny przykład pozwala komuś innemu odtworzyć twój problem, po prostu kopiując i wklejając kod R.

Są cztery rzeczy, które musisz uwzględnić, aby Twój przykład był powtarzalny: wymagane pakiety, dane, kod i opis twojego środowiska R.

  • Pakietypowinien być załadowany u góry skryptu, więc łatwo jest zobacz, które z nich wymaga przykład.

  • Najprostszy sposób dołączenia dane w e-mailu lub w pytaniu Stack Overflow jest użycie dput() generować kod R, aby go odtworzyć. Na przykład, aby odtworzyć plik mtcars zestaw danych w R, Wykonałbym następujące kroki:

    1. Biegać dput(mtcars) w R
    2. Skopiuj wynik
    3. W moim odtwarzalnym skrypcie wpisz mtcars <- następnie wklej.
  • Poświęć trochę czasu, upewniając się, że twoje kod jest łatwy dla innych czytać:

    • upewnij się, że używasz spacji, a nazwy zmiennych są zwięzłe, ale informacyjny

    • używaj komentarzy, aby wskazać, gdzie leży twój problem

    • postaraj się usunąć wszystko, co nie jest związane z problemem.
      Im krótszy jest twój kod, tym łatwiej go zrozumieć.

  • Uwzględnij dane wyjściowe sessionInfo() w komentarzu w twoim kodzie. To podsumowuje twoje R środowisko i ułatwia sprawdzenie, czy używasz nieaktualnej wersji pakiet.

Możesz sprawdzić, czy rzeczywiście stworzyłeś powtarzalny przykład, uruchamiając nową sesję R i wklejając skrypt.

Przed umieszczeniem całego kodu w wiadomości e-mail należy rozważyć jego włączenie Gith github . Sprawi, że twój kod będzie ładnie podkreślał składnię, a ty nie będziesz musiał się martwić, że coś zostanie zmanipulowane przez system poczty elektronicznej.


514



reprex w tidyverse to dobry pakiet do tworzenia minimalnego, powtarzalnego przykładu: github.com/tidyverse/reprex - mt1022
Dlaczego ktoś miałby umieścić kod w e-mailu? - Gilgamesh
Rutynowo otrzymuję wiadomości e-mail z kodem w nich. Otrzymuję nawet e-maile z załączonymi dokumentami zawierającymi kod. Czasami dostaję nawet e-maile z załączonymi dokumentami zawierającymi SCREENSHOTS kodu. - hadley


Osobiście wolę "jeden" wkładki. Coś w tym stylu:

my.df <- data.frame(col1 = sample(c(1,2), 10, replace = TRUE),
        col2 = as.factor(sample(10)), col3 = letters[1:10],
        col4 = sample(c(TRUE, FALSE), 10, replace = TRUE))
my.list <- list(list1 = my.df, list2 = my.df[3], list3 = letters)

Struktura danych powinna naśladować ideę problemu pisarza, a nie dokładną dosłowną strukturę. Naprawdę doceniam to, gdy zmienne nie zastępują moich własnych zmiennych lub nie daj Boże, funkcje (np df).

Alternatywnie można wyciąć kilka rogów i wskazać istniejący zestaw danych, np.

library(vegan)
data(varespec)
ord <- metaMDS(varespec)

Nie zapomnij podać żadnych specjalnych pakietów, z których możesz korzystać.

Jeśli próbujesz pokazać coś na większych obiektach, możesz spróbować

my.df2 <- data.frame(a = sample(10e6), b = sample(letters, 10e6, replace = TRUE))

Jeśli pracujesz z danymi przestrzennymi za pośrednictwem raster pakiet, możesz wygenerować losowe dane. Wiele przykładów można znaleźć w winiecie pakietu, ale oto mały samorodek.

library(raster)
r1 <- r2 <- r3 <- raster(nrow=10, ncol=10)
values(r1) <- runif(ncell(r1))
values(r2) <- runif(ncell(r2))
values(r3) <- runif(ncell(r3))
s <- stack(r1, r2, r3)

Jeśli potrzebujesz jakiegoś obiektu przestrzennego zaimplementowanego w sp, możesz uzyskać niektóre zbiory danych za pomocą plików zewnętrznych (takich jak plik shape ESRI) w pakietach "przestrzennych" (zobacz widok przestrzenny w widokach zadań).

library(rgdal)
ogrDrivers()
dsn <- system.file("vectors", package = "rgdal")[1]
ogrListLayers(dsn)
ogrInfo(dsn=dsn, layer="cities")
cities <- readOGR(dsn=dsn, layer="cities")

258



IMHO, podczas korzystania sample lub runif to jest roztropne set.seed. Przynajmniej ta sugestia, którą otrzymałem przy tworzeniu przykładów przekazujących na próbkowanie lub generowanie liczb losowych. - Konrad
@Konrad Zgadzam się, ale to może zależeć. Jeśli próbujesz wygenerować kilka liczb, nasienie może nie być potrzebne, ale jeśli próbujesz zrozumieć coś konkretnego, gdzie potrzebne są stałe liczby, nasiona będą obowiązkowe. - Roman Luštrik


Zainspirowany tym właśnie postem, teraz korzystam z przydatnej funkcji
reproduce(<mydata>) kiedy muszę wysłać do StackOverflow.


SZYBKIE INSTRUKCJE

Gdyby myData jest nazwą obiektu do odtworzenia, uruchom następujące w R:

install.packages("devtools")
library(devtools)
source_url("https://raw.github.com/rsaporta/pubR/gitbranch/reproduce.R")

reproduce(myData)

Detale:

Ta funkcja jest inteligentnym opakowaniem dput i wykonuje następujące czynności:

  • automatycznie pobiera duży zbiór danych (w zależności od rozmiaru i klasy, można dostosować wielkość próbki)
  • tworzy a dput wydajność
  • pozwala określić który kolumny do eksportu
  • dołącza do przodu objName <- ... dzięki czemu można go łatwo skopiować + wkleić, ale ...
  • Jeśli pracujesz na komputerze Mac, dane wyjściowe są automatycznie kopiowane do schowka, dzięki czemu możesz je po prostu uruchomić, a następnie wkleić do pytania.

Źródło jest dostępne tutaj:


Przykład:

# sample data
DF <- data.frame(id=rep(LETTERS, each=4)[1:100], replicate(100, sample(1001, 100)), Class=sample(c("Yes", "No"), 100, TRUE))

DF ma około 100 x 102. Chcę próbkować 10 wierszy i kilka określonych kolumn

reproduce(DF, cols=c("id", "X1", "X73", "Class"))  # I could also specify the column number. 

Daje następujące wyniki:

This is what the sample looks like: 

    id  X1 X73 Class
1    A 266 960   Yes
2    A 373 315    No            Notice the selection split 
3    A 573 208    No           (which can be turned off)
4    A 907 850   Yes
5    B 202  46   Yes         
6    B 895 969   Yes   <~~~ 70 % of selection is from the top rows
7    B 940 928    No
98   Y 371 171   Yes          
99   Y 733 364   Yes   <~~~ 30 % of selection is from the bottom rows.  
100  Y 546 641    No        


    ==X==============================================================X==
         Copy+Paste this part. (If on a Mac, it is already copied!)
    ==X==============================================================X==

 DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L, 25L, 25L), .Label = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"), class = "factor"), X1 = c(266L, 373L, 573L, 907L, 202L, 895L, 940L, 371L, 733L, 546L), X73 = c(960L, 315L, 208L, 850L, 46L, 969L, 928L, 171L, 364L, 641L), Class = structure(c(2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L), .Label = c("No", "Yes"), class = "factor")), .Names = c("id", "X1", "X73", "Class"), class = "data.frame", row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L)) 

    ==X==============================================================X==

Zauważ także, że całość wyjścia jest w ładnej pojedynczej, długiej linii, a nie wysokim akapicie rozdrobnionych linii. Dzięki temu łatwiej jest czytać posty z pytaniami SO, a także łatwiej kopiować i wklejać.


Aktualizacja października 2013:

Możesz teraz określić liczbę wierszy tekstu wyjściowego (np. Co wkleisz do StackOverflow). Użyj lines.out=n argument za tym. Przykład:

reproduce(DF, cols=c(1:3, 17, 23), lines.out=7) wydajność:

    ==X==============================================================X==
         Copy+Paste this part. (If on a Mac, it is already copied!)
    ==X==============================================================X==

 DF <- structure(list(id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 25L,25L, 25L), .Label
      = c("A", "B", "C", "D", "E", "F", "G", "H","I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V", "W", "X", "Y"), class = "factor"),
      X1 = c(809L, 81L, 862L,747L, 224L, 721L, 310L, 53L, 853L, 642L),
      X2 = c(926L, 409L,825L, 702L, 803L, 63L, 319L, 941L, 598L, 830L),
      X16 = c(447L,164L, 8L, 775L, 471L, 196L, 30L, 420L, 47L, 327L),
      X22 = c(335L,164L, 503L, 407L, 662L, 139L, 111L, 721L, 340L, 178L)), .Names = c("id","X1",
      "X2", "X16", "X22"), class = "data.frame", row.names = c(1L,2L, 3L, 4L, 5L, 6L, 7L, 98L, 99L, 100L))

    ==X==============================================================X==

241





Oto dobry przewodnik:

http://www.r-bloggers.com/three-tips-for-posting-good-questions-to-r-help-and-stack-overflow/

Najważniejsze jest jednak: wystarczy, że zrobisz mały fragment kodu, który możemy uruchomić, aby zobaczyć, na czym polega problem. Przydatną funkcją jest to dput(), ale jeśli masz bardzo duże dane, możesz zrobić mały przykładowy zestaw danych lub użyć tylko pierwszych 10 linii.

EDYTOWAĆ:

Upewnij się także, że zidentyfikowałeś problem sam. Przykładem nie powinien być cały skrypt R z komunikatem "W linii 200 wystąpił błąd". Jeśli korzystasz z narzędzi do debugowania w R (kocham browser()) i google powinieneś być w stanie naprawdę zidentyfikować problem i odtworzyć trywialny przykład, w którym to samo dzieje się nie tak.


168





Lista mailingowa R-help zawiera przewodnik po publikacji obejmuje zarówno zadawanie pytań, jak i udzielanie odpowiedzi, w tym przykład generowania danych:

Przykłady: Czasami pomaga   podać mały przykład, że ktoś   może faktycznie działać. Na przykład:

Jeśli mam macierz x w następujący sposób:

  > x <- matrix(1:8, nrow=4, ncol=2,
                dimnames=list(c("A","B","C","D"), c("x","y"))
  > x
    x y
  A 1 5
  B 2 6
  C 3 7
  D 4 8
  >

jak mogę przekształcić go w ramkę danych   z 8 wierszami i trzema kolumnami o nazwie   "wiersz", "kolumna" i "wartość", które mają   nazwy wymiarów są wartościami "row" i "col", tak jak poniżej:

  > x.df
     row col value
  1    A   x      1

...
  (Do której odpowiedzi może być:

  > x.df <- reshape(data.frame(row=rownames(x), x), direction="long",
                    varying=list(colnames(x)), times=colnames(x),
                    v.names="value", timevar="col", idvar="row")

)

Słowo mały jest szczególnie ważne. Powinieneś dążyć do minimalny powtarzalny przykład, co oznacza, że ​​dane i kod powinny być tak proste, jak to tylko możliwe, aby wyjaśnić problem.

EDYCJA: Ładny kod jest łatwiejszy do odczytania niż brzydki kod. Użyć przewodnik po stylu.


142





Od R.2.14 (jak sądzę) możesz przekazać swoją reprezentację tekstową bezpośrednio do read.table:

df <- read.table(header=T, text="Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
") 

136



Możesz także użyć read.table("clipboard", header=TRUE). - sebastian-c
@ sebastian-c jak to jest dobre do tworzenia powtarzalnego przykładu? :) - TMS
@TMS Daje to poważną myśl, jeśli pytający dostarczył dane, a problem jest mały (ale może mieć kilka rozwiązań), to może być szybszy i nadal można wykonać wszystkie kroki. - sebastian-c


Czasami problem jest naprawdę niemożliwy do odtworzenia przy użyciu mniejszej ilości danych, bez względu na to, jak bardzo się starasz, i nie ma to miejsca w przypadku danych syntetycznych (chociaż dobrze jest pokazać, jak tworzyłeś syntetyczne zestawy danych, nie odtworzyć problem, ponieważ wyklucza pewne hipotezy).

  • Konieczne może być opublikowanie danych w internecie i podanie adresu URL.
  • Jeżeli dane nie mogą zostać udostępnione ogółowi społeczeństwa, ale można je w ogóle udostępnić, wówczas może być w stanie zaoferować przesłanie go pocztą elektroniczną do zainteresowanych stron (chociaż ograniczy to liczbę osób, które będą się trudzić w pracy na tym).
  • Właściwie to nie widziałem, ponieważ ludzie, którzy nie mogą uwolnić swoich danych, są wrażliwi na uwolnienie go w jakiejkolwiek formie, ale wydaje się prawdopodobne, że w niektórych przypadkach można nadal publikować dane, jeśli zostały one wystarczająco zanonimizowane / zaszyfrowane / zepsute w pewnym sensie.

Jeśli nie możesz wykonać żadnej z tych czynności, prawdopodobnie musisz zatrudnić konsultanta, który rozwiąże problem ...

edytować: Dwa użyteczne pytania SO dotyczące anonimizacji / szyfrowania:


126



Do produkcji zestawów danych syntetycznych, odpowiedzi na to pytanie podać użyteczne przykłady, w tym aplikacje fitdistr i fitdistrplus. - Iterator


Odpowiedzi do tej pory są oczywiście świetne dla części odtwarzalności. Ma to jedynie na celu wyjaśnienie, że powtarzalny przykład nie może i nie powinien być jedynym składnikiem pytania. Nie zapomnij wyjaśnić, jak ma wyglądać i jakie są kontury twojego problemu, a nie tylko jak próbowałeś się do niego dostać. Kod to za mało; potrzebujesz też słów.

Oto powtarzalny przykład tego, czego należy unikać (na podstawie prawdziwego przykładu, nazw zmienionych w celu ochrony niewinnych):


Poniżej przedstawiono przykładowe dane i część funkcji, z którą mam problem.

code
code
code
code
code (40 or so lines of it)

Jak mogę to osiągnąć?



115





Aby szybko utworzyć dput Twoich danych możesz po prostu skopiować (część) danych do schowka i uruchomić w R:

dla danych w Excelu:

dput(read.table("clipboard",sep="\t",header=TRUE))

dla danych w pliku txt:

dput(read.table("clipboard",sep="",header=TRUE))

Możesz zmienić sep w razie potrzeby. Będzie to działać tylko wtedy, gdy twoje dane są w schowku.


100





Mam bardzo łatwy i skuteczny sposób na zrobienie przykładu R, który nie został wspomniany powyżej. Możesz najpierw zdefiniować swoją strukturę. Na przykład

mydata <- data.frame(a=character(0), b=numeric(0),  c=numeric(0), d=numeric(0))

>fix(mydata)

when you execute 'fix' command,you will get this pop-up box 

Następnie możesz wprowadzić dane ręcznie. Jest to przydatne w przypadku mniejszych przykładów, a nie dużych.


95



...następnie dput(mydata) - GSee
Jaki jest twój frontend? Byłoby miło mieć kompletną odpowiedź. Etc zrobić dane, które można bezpośrednio pętli jak for (d in data) {...}. - Léo Léopold Hertz 준영