programing

훌륭한 R 재현 가능 예제를 만드는 방법

linuxpc 2023. 6. 15. 21:37
반응형

훌륭한 R 재현 가능 예제를 만드는 방법

동료들과 성능에 대해 논의하거나, 교육하거나, 버그 보고서를 보내거나, 메일링 목록 및 스택 오버플로에 대한 지침을 검색할 때, 재현 가능한 예가 자주 요청되며 항상 도움이 됩니다.

훌륭한 사례를 만들기 위한 팁은 무엇입니까?r의 구조를 텍스트 형식으로 어떻게 붙여넣습니까?어떤 다른 정보를 포함해야 합니까?

사용하는 것 외에 다른 요령이 있습니까?dput(),dump()또는structure() 제언포야합까니를 포함해야 ?library()또는require()진술서?어떤 유보적인 단어를 피해야 하는지, 게다가.c,df,data 등등?

어떻게 하면 더 재현 가능한 예를 만들 수 있을까요?

기본적으로 최소 재현 가능한 예제(MRE)를 사용하면 다른 사용자가 자신의 컴퓨터에서 문제를 정확하게 재현할 수 있습니다.

데이터, 코드 또는 콘솔 출력의 이미지를 게시하지 마십시오!

tl;dr

MRE는 다음 항목으로 구성됩니다.

  • 문제를 입증하는 데 필요한 최소한의 데이터 세트
  • 문제를 재현하는 데 필요한 최소 실행 가능 코드로, 지정된 데이터 세트에서 실행할 수 있습니다.
  • 사용에 관한 모든 필요한 정보libraryR및 R 버전에서 R 전버, 그는실되 OS, 아도와 같습니다.sessionInfo()
  • 임의의 공정의 경우, 시드(에 의해 설정됨)set.seed()) 할 수 있도록

양호한 MRE의 예는 사용 중인 기능의 도움말 페이지 하단에 있는 "예" 섹션을 참조하십시오.예를 들어 입력합니다. help(mean) 짧은 는또 짧게짧▁or?meanR 콘솔로 이동합니다.

최소 데이터 세트 제공

일반적으로 대용량 데이터 세트를 공유할 필요가 없으며 다른 사용자가 질문을 읽지 못하도록 할 수 있습니다.따라서 기본 제공 데이터셋을 사용하거나 원래 데이터와 유사한 작은 "장난감" 예제를 만드는 것이 더 낫습니다. 이는 실제로 최소한의 의미입니다.어떤 이유로 원본 데이터를 공유해야 하는 경우 다음과 같은 방법을 사용해야 합니다.dput()다른 사용자가 사용자 데이터의 정확한 복사본을 얻을 수 있습니다.

기본 제공 데이터셋

기본 제공 데이터셋 중 하나를 사용할 수 있습니다.은 기본제데포다목통수있확다습니인해할로 할 수 .data()모든 데이터 세트에 대한 간단한 설명이 있으며, 다음과 같이 더 많은 정보를 얻을 수 있습니다.?irisR과 함께 제공되는 'iris' 데이터 세트의 경우.설치된 패키지에는 추가 데이터셋이 포함될 수 있습니다.

예제 데이터 세트 생성

예비 참고 사항:요인, 날짜 또는 시계열과 같은 특수 형식(예: 클래스)이 필요할 수도 있습니다.이를 위해 다음과 같은 기능을 사용합니다.as.factor,as.Date,as.xts... 예:

d <- as.Date("2020-12-30")

어디에

class(d)
# [1] "Date"

벡터

x <- rnorm(10)  ## random vector normal distributed
x <- runif(10)  ## random vector uniformly distributed    
x <- sample(1:100, 10)  ## 10 random draws out of 1, 2, ..., 100    
x <- sample(LETTERS, 10)  ## 10 random draws out of built-in latin alphabet

행렬

m <- matrix(1:12, 3, 4, dimnames=list(LETTERS[1:3], LETTERS[1:4]))
m
#   A B C  D
# A 1 4 7 10
# B 2 5 8 11
# C 3 6 9 12

데이터 프레임

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=rnorm(n))
dat
#   id       date group age   type         x
# 1  1 2020-12-26     A  27 type 1 0.0356312
# 2  2 2020-12-27     B  19 type 2 1.3149588
# 3  3 2020-12-28     A  20 type 3 0.9781675
# 4  4 2020-12-29     B  26 type 4 0.8817912
# 5  5 2020-12-30     A  26 type 5 0.4822047
# 6  6 2020-12-31     B  28 type 6 0.9657529

참고: 널리 사용되지만 데이터 프레임의 이름을 지정하지 않는 것이 좋습니다.df, 냐면왜df()R 점에서 )입니다.xF 분포의 )이며 충돌이 발생할 수 있습니다.

원본 데이터 복사

특정한 이유가 있거나 예제를 구성하기가 너무 어려운 데이터가 있는 경우 다음을 사용하여 원본 데이터의 작은 부분 집합을 제공할 수 있습니다.dput.

을 사용하는 dput()?

dput에서는 콘솔에 데이터를 정확하게 복제하는 데 필요한 모든 정보를 표시합니다.출력을 복사하여 질문에 붙여넣기만 하면 됩니다.

하기 르기dat(위에서)는 질문에서 공유하는 경우 변수 클래스 및 기타 기능에 대한 정보가 부족한 출력을 생성합니다. 게가은, type칼럼은 그것으로 어떤 것도 하기 어렵게 만듭니다.데이터 사용을 시작하더라도 데이터의 중요한 기능을 제대로 파악할 수 없습니다.

  id       date group age   type         x
1  1 2020-12-26     A  27 type 1 0.0356312
2  2 2020-12-27     B  19 type 2 1.3149588
3  3 2020-12-28     A  20 type 3 0.9781675

데이터 부분 집합 취하기

부분 집합을 공유하려면 사용head(),subset() 또 지 수 는 지.iris[1:4, ]그리고 나서 포장합니다.dput()즉시 R에 넣을 수 있는 것을 다른 사람들에게 주는 것.예제

dput(iris[1:4, ]) # first four rows of the iris data set

질문에 공유할 콘솔 출력:

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")), row.names = c(NA, 
4L), class = "data.frame")

을 할 때dputdput(mtcars[1:3, c(2, 5, 6))과 같은 열만 할 수 .

참고: 데이터 프레임에 여러 수준의 요인이 있는 경우dput가능한 요인 수준이 데이터의 부분 집합에 없는 경우에도 모든 요인 수준이 나열되기 때문에 출력이 다루기 어려울 수 있습니다.이 문제를 해결하려면 다음을 사용할 수 있습니다.droplevels()기능.아래에서 종들이 어떻게 하나의 수준만을 갖는 요인인지 주목하십시오. 예를 들어,dput(droplevels(iris[1:4, ]))에 대한 또 다른 주의 사항dput키가 있는 경우에는 작동하지 않습니다.data.table 그룹화된 체개그된개체에 tbl_df(클래스)grouped_dftidyverse공유하기 에 일반 할 수 .dput(as.data.frame(my_data)).

최소 코드 생성

최소한의 데이터(위 참조)와 결합하여 코드는 문제를 복사하고 붙여넣기만 하면 다른 기계에서 정확하게 재현할 수 있습니다.

이것은 쉬운 부분이어야 하지만 종종 그렇지 않습니다.하지 말아야 할 일:

  • 모든 종류의 데이터 변환 표시; 제공된 데이터가 이미 올바른 형식인지 확인합니다(물론 문제가 되지 않는 한).
  • 어딘가에 오류를 주는 전체 스크립트를 복사합니다.오류가 발생한 행을 정확히 찾습니다.대부분의 경우, 여러분은 자신의 문제가 무엇인지 알게 될 것입니다.

수행해야 할 작업:

  • ).library())
  • 코드가 실행 가능한지 확인하기 위해 새로운 R 세션에서 코드를 테스트합니다.사람들은 당신의 데이터와 코드를 콘솔에 복사하여 붙여넣고 당신이 가지고 있는 것과 같은 것을 얻을 수 있어야 합니다.
  • 파일을 합니다.unlink())
  • 옵션을 변경하는 경우 코드에 원래 옵션으로 되돌리기 위한 문이 포함되어 있는지 확인합니다.(예:op <- par(mfrow=c(1,2)) ...some code... par(op))

필요한 정보 제공

대부분의 경우 R 버전과 운영 체제만 있으면 충분합니다. " 지와충발이경생다우음출제다공니합력을의"의 합니다.sessionInfo()정말 도움이 될 수 있습니다.ODBC 등을 통해 다른 응용 프로그램에 대한 연결에 대해 설명할 때는 해당 응용 프로그램의 버전 번호와 가능한 경우 설치에 필요한 정보도 제공해야 합니다.

R Studio에서 R을 실행하는 경우,rstudioapi::versionInfo()RStudio 버전을 보고하는 데 도움이 됩니다.

패키지에 에는 " 가▁of▁by▁version▁if▁output▁package,▁the▁giving"의 출력을 제공하여 패키지 버전을 .packageVersion("name of the package").

용사를 합니다.set.seed()시드를1 지정할 수 있습니다. 즉, 특정 상태, R의 난수 생성기가 고정됩니다.이를 통해 다음과 같은 임의의 함수를 사용할 수 있습니다.sample(),rnorm(),runif()그리고 많은 다른 사람들은 항상 같은 결과를 반환합니다. 예:

set.seed(42)
rnorm(3)
# [1]  1.3709584 -0.5646982  0.3631284

set.seed(42)
rnorm(3)
# [1]  1.3709584 -0.5646982  0.3631284

1 참고:출력입니다.set.seed()R > 3.6.0과 이전 버전 간에 차이가 있습니다.랜덤 프로세스에 사용한 R 버전을 지정하고 이전 질문을 따를 때 약간 다른 결과가 나와도 놀라지 마십시오.이러한 경우 동일한 결과를 얻으려면 다음을 사용할 수 있습니다.RNGversion() before -function을 사용합니다.set.seed() (예:)RNGversion("3.5.2")).

(여기 재현 가능한 예제를 작성하는 방법에 대한 조언이 있습니다.짧지만 달콤하게 하려고 노력했습니다.r4ds의 "워크플로우: 도움말 보기" 섹션 9.2는 reprex 패키지에 대해서도 논의하는 보다 최근의 문서입니다.)

재현 가능한 예제 작성 방법

재현 가능한 예제를 제공하면 R 문제에 도움을 받을 가능성이 높습니다.재현 가능한 예를 통해 다른 사람이 R 코드를 복사하여 붙여넣기만 하면 문제를 다시 만들 수 있습니다.

예제를 재현하려면 필수 패키지, 데이터, 코드 및 R 환경에 대한 설명 등 네 가지를 포함해야 합니다.

  • 패키지는 스크립트의 맨 위에 로드해야 하므로 예제에 필요한 패키지를 쉽게 확인할 수 있습니다.

  • 이메일 또는 스택 오버플로 질문에 데이터를 포함하는 가장 쉬운 방법은 다음과 같습니다.dput()R 코드를 생성하여 재생성합니다. 예들어면을 만들려면 을재하려성생다음를▁for면을 사용합니다.mtcarsR의 데이터 세트를 사용하여 다음 단계를 수행합니다.

    1. 려달을 합니다.dput(mtcars) »
    2. 출력 복사
    3. 재현 가능한 스크립트에 다음을 입력합니다.mtcars <- 그다음에 붙여주세요.
  • 다른 사용자가 코드를 쉽게 읽을 수 있도록 잠시 시간을 할애합니다.

    • 공백을 사용했으며 변수 이름이 간결하지만 유용한지 확인합니다.

    • 의견을 사용하여 문제의 위치를 표시합니다.

    • 문제와 관련이 없는 모든 것을 제거하기 위해 최선을 다합니다.
      코드가 짧을수록 이해하기 쉽습니다.

  • 의 합니다.sessionInfo()당신의 코드에 있는 코멘트에서.R 환경을 요약하고 오래된 패키지를 사용하는지 쉽게 확인할 수 있습니다.

새 R 세션을 시작하고 스크립트를 붙여넣으면 실제로 재현 가능한 예제를 만들 수 있습니다.

모든 코드를 이메일에 넣기 전에 Gistithub에 넣는 것을 고려해 보십시오.그러면 코드가 구문 강조 표시되고 전자 메일 시스템에 의해 망가질 염려가 없습니다.

개인적으로, 저는 "한" 라이너를 선호합니다.다음과 같은 것들이 있습니다.

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)

데이터 구조는 정확한 동사 구조가 아니라 필자의 문제에 대한 아이디어를 모방해야 합니다.변수가 내 변수나 신이 금지한 함수를 덮어쓰지 않을 때 정말 감사합니다.df).

또는 몇 개의 모서리를 잘라내고 다음과 같은 기존 데이터 세트를 가리킬 수 있습니다.

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

사용 중인 특별 패키지에 대해 언급하는 것을 잊지 마십시오.

더 큰 물체에서 무언가를 시연하려는 경우, 시도할 수 있습니다.

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

를 통해 공간 경우raster패키지를 사용하면 몇 가지 랜덤 데이터를 생성할 수 있습니다.패키지 vignett에서 많은 예를 찾을 수 있지만, 여기 작은 너겟이 있습니다.

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)

에서 구현된 어떤 하다면,sp일부 데이터 세트는 "공간적" 패키지의 외부 파일(예: ESRI 모양 파일)을 통해 얻을 수 있습니다(작업 보기의 공간 보기 참조).

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

바로 이 게시물에서 영감을 받아 이제는 편리한 기능을 사용합니다.reproduce(<mydata>)스택 오버플로에 게시해야 할 때.


빠른 지침

한다면myData입니다. 재생할입의에서 합니다. R에서 다음을 실행합니다.

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

reproduce(myData)

세부사항:

이 함수는 다음에 대한 지능형 래퍼입니다.dput다음 작업을 수행합니다.

  • 크기 및 클래스를 기준으로 대용량 데이터 세트를 자동으로 샘플링합니다.샘플 크기 조정 가능)
  • 다음을 작성합니다.dput
  • 내보낼 열을 지정할 수 있습니다.
  • 앞에 추가됩니다.objName <- ...쉽게 복사+붙여넣기 할 수 있도록, 하지만...
  • Mac에서 작업하는 경우 출력이 자동으로 클립보드에 복사되므로 출력을 실행한 다음 질문에 붙여넣기만 하면 됩니다.

출처는 다음과 같습니다.


예:

# 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는 약 100 x 102입니다.10개의 행과 몇 개의 특정 열을 샘플링하고 싶습니다.

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

다음 출력을 제공합니다.

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==

또한 전체 출력은 길게 잘라진 줄의 단락이 아니라 하나의 긴 줄로 되어 있습니다.이를 통해 스택 오버플로 질문 게시물을 보다 쉽게 읽을 수 있으며 복사 및 붙여넣기도 쉬워집니다.


2013년 10월 업데이트:

이제 텍스트 출력에서 차지할 줄 수(즉, 스택 오버플로에 붙여넣을 줄)를 지정할 수 있습니다.을 합니다.lines.out=n이에 대한 주장예:

reproduce(DF, cols=c(1:3, 17, 23), lines.out=7)산출량:

    ==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==

여기 좋은 안내서가 있습니다.

가장 중요한 점은 우리가 실행할 수 있는 작은 코드 조각을 만들어 문제가 무엇인지 확인하는 것입니다.이에 유용한 기능은 다음과 같습니다.dput()그러나 데이터가 매우 큰 경우에는 작은 표본 데이터 집합을 만들거나 처음 10줄 정도만 사용할 수 있습니다.

편집:

또한 문제가 어디에 있는지 확인해야 합니다.예제는 "On line 200 There a error"가 있는 전체 R 스크립트가 아니어야 합니다.만약 당신이 R에서 디버깅 도구를 사용한다면 (나는 사랑합니다.browser()와 구글,할 수 .)와 구글은 문제가 어디에 있는지 정말로 파악하고 동일한 것이 잘못되는 사소한 예를 재현할 수 있어야 합니다.

R-help 메일링 목록에는 데이터 생성 예를 포함하여 질문과 답변을 모두 다루는 게시 가이드가 있습니다.

예:때로는 누군가가 실제로 실행할 수 있는 작은 예를 제공하는 것이 도움이 됩니다.예:

행렬 x가 다음과 같은 경우:

  > 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
  >

다음과 같이 8개의 행과 'row', 'col', 'value'라는 세 개의 열로 구성된 데이터 프레임으로 변환할 수 있습니다. 이 열 이름을 'row'와 'col'의 값으로 지정할 수 있습니까?

  > x.df
     row col value
  1    A   x      1

...
은 다음과

  > 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")

)

small이라는 단어는 특히 중요합니다.최소한의 재현 가능한 예제를 목표로 해야 합니다. 즉, 데이터와 코드가 문제를 설명하기 위해 가능한 한 단순해야 합니다.

편집: 예쁜 코드는 못생긴 코드보다 읽기 쉽습니다.스타일 가이드를 사용합니다.

R.2.14 ("R.2.14")에 할 수 .read.table:

 df <- read.table(header=TRUE, 
  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
") 

때로는 아무리 노력해도 작은 데이터 조각으로는 문제를 재현할 수 없고 합성 데이터에서도 문제가 발생하지 않습니다(일부 가설을 배제하기 때문에 문제를 재현하지 않은 합성 데이터 세트를 어떻게 생성했는지 보여주는 것이 유용하지만).

  • 데이터를 웹 어딘가에 게시하고 URL을 제공해야 할 수도 있습니다.
  • 데이터를 일반에 공개할 수는 없지만 공유할 수 있는 경우 관심 있는 사람들에게 이메일로 데이터를 전송할 수 있습니다(이를 통해 작업하는 사람의 수가 줄어들겠지만).
  • 데이터를 공개할 수 없는 사람들은 어떤 형태로든 공개하는 것에 민감하기 때문에 실제로 이 작업을 수행한 적은 없지만, 어떤 경우에는 충분히 익명화/스크램블/손상된 데이터를 게시할 수 있을 것으로 보입니다.

이 중 어느 것도 할 수 없다면 문제를 해결하기 위해 컨설턴트를 고용해야 할 것입니다.

편집: 익명화/스크램블링에 유용한 두 가지 SO 질문:

지금까지의 답변은 재현성 부분에서 분명히 훌륭합니다.이것은 단지 재현 가능한 예가 질문의 유일한 구성 요소가 될 수 없고 되어서는 안 된다는 것을 명확히 하기 위한 것입니다.여러분이 지금까지 어떻게 그것에 도달하기 위해 시도했는지뿐만 아니라 여러분이 원하는 것이 무엇이고 여러분의 문제의 윤곽을 설명하는 것을 잊지 마세요.코드로는 충분하지 않습니다. 단어도 필요합니다.

다음은 피해야 할 일의 재현 가능한 예입니다(실제 예에서 발췌한 것으로, 무고한 사람들을 보호하기 위해 이름이 변경되었습니다).


다음은 제가 문제가 있는 기능의 일부와 샘플 데이터입니다.

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

어떻게 하면 이를 달성할 수 있을까요?


위에서 언급하지 않은 R 예제를 만드는 매우 쉽고 효율적인 방법이 있습니다.먼저 구조를 정의할 수 있습니다.예를들면,

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

그런 다음 데이터를 수동으로 입력할 수 있습니다.이것은 큰 예보다 작은 예에 효율적입니다.

지침:


질문을 작성할 때 여러분의 주요 목표는 독자들이 여러분의 문제를 이해하고 그들의 시스템에 재현할 수 있도록 최대한 쉽게 만드는 것이어야 합니다.수행 방법:

  1. 입력 데이터 제공
  2. 예상 출력 제공
  3. 문제를 간결하게 설명합니다.
    • 만약 당신이 20줄 이상의 텍스트 + 코드를 가지고 있다면, 당신은 아마도 돌아가서 단순화할 수 있을 것입니다.
    • 문제/오류를 유지하면서 코드를 최대한 단순화합니다.

이것은 약간의 노력이 필요하지만, 당신이 다른 사람들에게 당신을 위해 일하라고 요구하기 때문에 공정한 절충안인 것처럼 보입니다.

데이터 제공:


기본 제공 데이터 세트

가장 좋은 방법은 내장된 데이터셋에 의존하는 것입니다.이렇게 하면 다른 사람들이 문제를 해결하기가 매우 쉽습니다.유형data()R 프롬프트에서 사용 가능한 데이터를 확인합니다. 가지 인 예 가지고 예인적전몇예:

  • iris
  • mtcars
  • ggplot2::diamonds 패키지, 사람들이 있습니다 (패외키지거, 그러모사가있다지니습고이람든의나부)

기본 제공 데이터 세트를 검사하여 문제에 적합한 데이터 세트를 찾습니다.

기본 제공 데이터셋을 사용하도록 문제를 바꿀 수 있다면 좋은 답변(및 투표)을 얻을 가능성이 훨씬 더 높습니다.

자체 생성 데이터

문제가 기존 데이터 세트에 표시되지 않는 데이터 유형으로 한정된 경우 문제가 나타나는 가장 작은 데이터 세트를 생성하는 R 코드를 제공합니다.예를들면

set.seed(1)  # important to make random data reproducible
myData <- data.frame(a=sample(letters[1:5], 20, rep=T), b=runif(20))

제 질문에 대답하려는 누군가가 이 두 줄을 복사/붙여넣고 즉시 문제 해결을 시작할 수 있습니다.

덤핑

최후의 수단으로, 당신은 사용할 수 있습니다.dput를 R R체변니다합환로드코)로 변환합니다.dput(myData) )의 출력이 "수단"이기 때문에 "마지막 수단"이라고 말합니다."이라고 말합니다dput종종 상당히 다루기 어렵고 복사하기 귀찮으며 질문의 나머지 부분을 흐리게 합니다.

예상 출력 제공:


누군가가 이렇게 말했습니다.

예상 출력의 그림은 1000단어의 가치가 있습니다.

현명한 사람

"이 결과를 얻을 것으로 예상했습니다"와 같은 것을 추가할 수 있는 경우:

   cyl   mean.hp
1:   6 122.28571
2:   4  82.63636
3:   8 209.21429

당신의 질문에, 사람들은 당신이 무엇을 빨리 하려고 하는지 이해할 가능성이 훨씬 더 높습니다.예상되는 결과가 크고 다루기 어려운 경우 문제를 단순화하는 방법에 대해 충분히 생각하지 못했을 수 있습니다(다음 참조).

문제를 간결하게 설명합니다.


주로 해야 할 일은 질문을 하기 전에 가능한 한 문제를 단순화하는 것입니다.이와 관련하여 기본 제공 데이터 세트로 작동하도록 문제를 재구성하는 것이 많은 도움이 될 것입니다.또한 단순화 과정을 거치는 것만으로도 자신의 문제에 답할 수 있다는 것을 종종 발견하게 될 것입니다.

다음은 좋은 질문의 몇 가지 예입니다.

두 경우 모두 사용자의 문제는 사용자가 제공하는 간단한 예가 아닙니다.오히려 문제의 본질을 추상화하여 간단한 데이터 세트에 적용하여 질문을 던졌습니다.

이 질문에 대한 또 다른 답은 무엇입니까?


이 답변은 제가 생각하는 최상의 방법에 초점을 맞춥니다. 즉, 기본 제공 데이터 세트를 사용하고 결과적으로 최소한의 형태로 원하는 것을 제공하는 것입니다.가장 두드러진 답변은 다른 측면에 초점을 맞춥니다.저는 이 대답이 유명해질 것이라고 기대하지 않습니다. 이것은 오로지 제가 초보 질문에 대한 의견으로 연결할 수 있도록 하기 위해 여기에 있습니다.

를 빨리 dput을 실행할 수 있습니다. RR:R:R" "R" "R" "R" "R" "R" "R" "R" "R" "R"을하십시오.

Excel 데이터의 경우:

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

.txt 파일의 데이터의 경우:

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

변경할 수 .sep데이터가 클립보드에 있는 경우에만 작동합니다.

재생 가능한 코드는 도움을 받을 수 있는 열쇠입니다.그러나 데이터의 일부라도 붙여넣는 것에 회의적인 사용자가 많습니다.예를 들어, 민감한 데이터나 연구 논문에 사용하기 위해 수집된 원본 데이터로 작업할 수 있습니다.

어떤 이유로든, 저는 공개적으로 데이터를 게시하기 전에 데이터를 "변형"할 수 있는 편리한 기능이 있으면 좋겠다고 생각했습니다.anonymize를 사용할 수 없습니다.SciencesPo매우 어리석지만, 저에게는 그것이 잘 작동합니다.dput기능.

install.packages("SciencesPo")

dt <- data.frame(
    Z = sample(LETTERS,10),
    X = sample(1:10),
    Y = sample(c("yes", "no"), 10, replace = TRUE)
)
> dt
   Z  X   Y
1  D  8  no
2  T  1 yes
3  J  7  no
4  K  6  no
5  U  2  no
6  A 10 yes
7  Y  5  no
8  M  9 yes
9  X  4 yes
10 Z  3  no

그리고 익명화합니다.

> anonymize(dt)
     Z    X  Y
1   b2  2.5 c1
2   b6 -4.5 c2
3   b3  1.5 c1
4   b4  0.5 c1
5   b7 -3.5 c1
6   b1  4.5 c2
7   b9 -0.5 c1
8   b5  3.5 c2
9   b8 -1.5 c2
10 b10 -2.5 c1

익명화 및 dput 명령을 적용하기 전에 전체 데이터 대신 몇 가지 변수를 샘플링할 수도 있습니다.

    # Sample two variables without replacement
> anonymize(sample.df(dt,5,vars=c("Y","X")))
   Y    X
1 a1 -0.4
2 a1  0.6
3 a2 -2.4
4 a1 -1.4
5 a2  3.6

예를 들어 데이터가 필요한 경우가 많지만 정확한 데이터는 게시하지 않습니다.설정된 라이브러리에서 일부 기존 data.frame을 사용하려면 data 명령을 사용하여 가져옵니다.

예.,

data(mtcars)

그런 다음 문제를 수행합니다.

names(mtcars)
your problem demostrated on the mtcars data set

하여 스크립트에 수 큰 세트가 dput()붙여넣기 에 데이터를 게시하고 다음을 사용하여 로드합니다.read.table:

d <- read.table("http://pastebin.com/raw.php?i=m1ZJuKLH")

헨리크에게 영감을 받았습니다.

때때로 재현 가능한 데이터를 빠르게 공유해야 하는 이러한 요구를 해결하기 위해 웨이크필드 패키지를 개발하고 있습니다.dput소규모 데이터 세트에서는 잘 작동하지만, 우리가 다루는 많은 문제들은 훨씬 더 크고, 이렇게 큰 데이터 세트를 공유합니다.dput비실용적입니다.

정보:

웨이크필드를 사용하면 사용자가 데이터를 재생성하기 위해 최소한의 코드를 공유할 수 있습니다.사용자가 설정합니다.n수)를 데이터를 함수합니다.

설치:

현재(2015-06-11) wakefield는 GitHub 패키지이지만 장치 테스트가 작성된 후 최종적으로 CRAN으로 이동합니다.신속하게 설치하려면 다음을 사용합니다.

if (!require("pacman")) install.packages("pacman")
pacman::p_load_gh("trinker/wakefield")

예:

다음은 예입니다.

r_data_frame(
    n = 500,
    id,
    race,
    age,
    sex,
    hour,
    iq,
    height,
    died
)

이를 통해 다음과 같은 이점을 얻을 수 있습니다.

    ID  Race Age    Sex     Hour  IQ Height  Died
1  001 White  33   Male 00:00:00 104     74  TRUE
2  002 White  24   Male 00:00:00  78     69 FALSE
3  003 Asian  34 Female 00:00:00 113     66  TRUE
4  004 White  22   Male 00:00:00 124     73  TRUE
5  005 White  25 Female 00:00:00  95     72  TRUE
6  006 White  26 Female 00:00:00 104     69  TRUE
7  007 Black  30 Female 00:00:00 111     71 FALSE
8  008 Black  29 Female 00:00:00 100     64  TRUE
9  009 Asian  25   Male 00:30:00 106     70 FALSE
10 010 White  27   Male 00:30:00 121     68 FALSE
.. ...   ... ...    ...      ... ...    ...   ...

있다면,factor 에한변으로 할 수 있도록 dput(head(mydata))가를고니다합을 추가하는 것을 .droplevels 요인의 입니다.dput출력, 예제를 최소화하기 위해:

dput(droplevels(head(mydata)))

원래 게시물은 데이터 캠프에서 현재 폐기된 r-fiddle 서비스를 참조했습니다.그것은 데이터 캠프 라이트로 다시 이름이 바뀌었고 제 답변에 표시된 것처럼 쉽게 내장될 수 없습니다.

저는 http://old.r-fiddle.org/ 링크가 문제를 공유하는 아주 깔끔한 방법이 될 수 있을지 궁금합니다.그것은 SO에 내장하는 것을 생각할 수 있는 것처럼 고유한 ID를 받습니다.

콘솔 출력을 다음과 같이 붙여넣지 마십시오.

If I have a matrix x as follows:
> 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
>

How can I turn it into a dataframe with 8 rows, and three
columns named `row`, `col`, and `value`, which have the
dimension names as the values of `row` and `col`, like this:
> x.df
    row col value
1    A   x      1
...
(To which the answer might be:
> 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")
)

직접 복사하여 붙여넣을 수 없습니다.

질문과 답변을 적절하게 재현하려면 제거하십시오.+&>에 시게및게전에기하시전에▁before▁posting기하▁put.#다음과 같은 출력 및 주석의 경우:

#If I have a matrix x as follows:
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

# How can I turn it into a dataframe with 8 rows, and three
# columns named `row`, `col`, and `value`, which have the
# dimension names as the values of `row` and `col`, like this:

#x.df
#    row col value
#1    A   x      1
#...
#To which the answer might be:

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")

한 가지 더, 특정 패키지의 기능을 사용한 적이 있다면 해당 라이브러리를 언급하십시오.

reprex를 사용하여 이 작업을 수행할 수 있습니다.

mt1022가 언급했듯이, "...최소한의 재현 가능한 예제를 생성하기에 좋은 패키지는 tidyverse의 "reprex"입니다."

Tidyverse에 따르면:

"reprex"의 목표는 다른 사람들이 실행하고 당신의 고통을 느낄 수 있도록 당신의 문제 코드를 포장하는 것입니다.

예를 들어 깔끔한 웹사이트에서 볼 수 있습니다.

library(reprex)
y <- 1:4
mean(y)
reprex() 

저는 이것이 재현 가능한 예를 만드는 가장 간단한 방법이라고 생각합니다.

제가 매우 흥미롭다고 생각한 위의 모든 답변을 제외하고, 여기에서 논의하는 것은 때때로 매우 쉬울 수 있습니다.R에 대한 도움을 얻기 위해 재현 가능한 최소 예제를 만드는 방법

랜덤 벡터를 만드는 방법은 여러 가지가 있습니다. R의 랜덤 값을 소수점 2개로 반올림하거나 R의 랜덤 행렬을 사용하여 100개의 숫자 벡터를 만듭니다.

mydf1<- matrix(rnorm(20),nrow=20,ncol=5)

차원 등 다양한 이유로 인해 주어진 데이터를 공유하기가 매우 어려운 경우가 있습니다.그러나 위의 모든 답변은 훌륭하며, 재현 가능한 데이터 예제를 만들고 싶을 때 생각하고 사용하는 것이 매우 중요합니다.그러나 (OP가 원본 데이터를 공유할 수 없는 경우) 원본만큼 데이터를 대표하도록 하려면 (데이터를 mydf1이라고 부르는 경우) 데이터 예제와 함께 일부 정보를 추가하는 것이 좋습니다.

class(mydf1)
# this shows the type of the data you have
dim(mydf1)
# this shows the dimension of your data

또한 데이터 구조가 될 수 있는 데이터의 유형, 길이 및 속성을 알아야 합니다.

#found based on the following
typeof(mydf1), what it is.
length(mydf1), how many elements it contains.
attributes(mydf1), additional arbitrary metadata.

#If you cannot share your original data, you can str it and give an idea about the structure of your data
head(str(mydf1))

다음은 제가 제안한 몇 가지입니다.

  • 기본 R 데이터 세트 사용 시도
  • 의 데이터 집합이 에는 자체데집있는경데우집포다함니합합을이터합이터이▁them,▁if▁with다▁include니▁your포합함▁youdput그래서 다른 사람들이 당신을 더 쉽게 도울 수 있습니다.
  • 을 사용하지 .install.package()정말로 필요하지 않다면, 사람들은 당신이 그냥 사용하면 이해할 것입니다.require또는library
  • 간결하게 해보세요.

    • 데이터셋을 가지고 있습니다.
    • 필요한 출력을 최대한 간단하게 설명합니다.
    • 질문하기 전에 직접 하세요.
  • 이미지를 업로드하는 것은 쉬우므로 그림을 업로드합니다.
  • 발생할 수 있는 모든 오류도 포함합니다.

이 모든 것은 재현 가능한 예의 일부입니다.

의기을사것좋습다니이는용하능▁▁the▁functions의 기능을 사용하는 testthat발생할 것으로 예상되는 내용을 보여주는 패키지입니다.따라서 다른 사용자가 오류 없이 실행될 때까지 코드를 변경할 수 있습니다.이렇게 하면 텍스트 설명을 디코딩할 필요가 없으므로 도움을 받으려는 사용자의 부담이 줄어듭니다.를 들어, .

library(testthat)
# code defining x and y
if (y >= 10) {
    expect_equal(x, 1.23)
} else {
    expect_equal(x, 3.21)
}

는 "10과 같거나 초과하는 y의 경우 x가 1.23이 되고 그렇지 않으면 3.21이 될 것으로 생각하지만 두 가지 모두 결과를 얻지 못했습니다."이 어리석은 예에서도, 저는 단어보다 코드가 더 명확하다고 생각합니다.용사를 합니다.testthat하여 시간을알 수 합니다. 가 코드를 게시하기 를 해결했음을 알 수 .

언급URL : https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example

반응형