2016-07-13 3 views
1

이것은 아마도 매우 어리석은 질문 일 것입니다. 그러나 스스로 작성한 기능이 작동하는지 여부를 어떻게 확인할 수 있습니까?사용자 정의 함수가 r에서 작동하는지 확인하는 방법은 무엇입니까?

많은 다른 함수와 루프가 포함 된 매우 간단한 함수를 작성하고 있으며 오류/버그를 확인하거나 함수가 작동하는지 단순히 확인하는 방법이 있는지 궁금합니다. 간단한 가짜 데이터 프레임을 만들고 테스트 해 보시겠습니까?

의견에 다른 사용자가 제안한대로 필자가 작성한 함수의 일부를 추가했습니다. 그래서 기본적으로 나는 좋은 데이터와 나쁜 데이터가있는 데이터 프레임을 가지고 있으며 나쁜 데이터는 플래그로 표시되어 있습니다. 사용자가 flag.option을 1로 설정했을 때 평소와 같이 (플래그 포인트가있는) 플롯을 생성 할 수있는 함수를 작성하고 사용자가 flag.option을 0으로 설정할 때 플롯에서 플래그 포인트를 제거합니다.

AIR.plot <- function(mydata, flag.option) { 
if (flag.option == 1) { 
par(mfrow(2,1)) 
conc <- tapply(mydata$CO2, format(mydata$date, "%Y-%m-%d %T"), mean) 
dates <- seq(mydata$date[1], mydata$date[nrow(mydata(mydata))], length =  nrow(conc)) 
plot(dates, conc, 
    type = "p", 
    col = "blue", 
    xlab = "day", 
    ylab = "CO2"), error = function(e) plot.new(type = "n") 
barplot(mydata$lines, horiz = TRUE, col = c("red", "blue")) # this is just a small bar plot on the bottom that specifies which sample-taking line (red or blue) is providing the samples 
} else if (flag.option == 0) { 
# I haven't figured out how to write this part yet but essentially I want to remove all 
# of the rows with flags on 
} 
} 

미리 감사드립니다. 저는 경험이 많은 R 사용자가 아니므로 제발 도와주세요.

+0

무엇을 할 예정입니까? 실제로 무엇을합니까? 그들은 같은가요? 왜 당신은 질문에 함수를 포함시키지 않았습니까? – cory

+0

https://en.wikipedia.org/wiki/Correctness_(computer_science) https://en.wikipedia.org/wiki/Program_analysis –

+0

"직장"이란 무엇을 의미합니까? "오류없이 반환"을 의미합니까? 또는 예상 행동을 수행하십시오. 여기서 행동은 무엇이되어야한다고 공식적으로 지정 했습니까? 또는 주어진 입력 집합에 대해 "올바른"출력을 반환합니다. 올바른 출력이 미리 정의되어 있습니까? 당신은 질문이 너무 애매하고 너무 넓습니다. 바보 같은 질문은 없습니다, 걱정하지 마십시오! 세부 정보를 추가하고 의미를 분명히하십시오. –

답변

3

작업 환경에서 코드를 우리 프로덕션 환경으로 릴리스하기 전에 일련의 테스트 절차를 거쳐 코드가 원하는 방식으로 작동하는지 확인합니다. 일반적으로 코드에 대한 시각이 다른 여러 사람들이 관련되어 있습니다.

코드를 작성하기 전에 이러한 확인 작업을 시작하는 것이 가장 이상적입니다. 답변을 드릴 수있는 몇 가지 질문은 다음과 같습니다.

  1. 코드는 어떻게해야합니까?
  2. 어떤 입력을 받아 들여야합니까? (유형, 범위 등 포함)
  3. 출력은 어떻게 생겼을 까?
  4. 누락 된 값은 어떻게 처리합니까?
  5. NULL 값은 어떻게 처리합니까?
  6. 길이가 0 인 값은 어떻게 처리합니까?

당신이 요구 의 목록을 준비한다면 당신이 코드를 작성하기 시작 전에 문서 쓰기, 성공 확률은 꽤 빨리 올라갑니다. 당연히 코드 작성을 시작할 때 요구 사항을 조정해야하거나 함수 인수를 수정해야 할 수도 있습니다. 괜찮습니다. 그러나 은 변경 사항이있을 때이를 문서화합니다..

함수를 작성하는 동안 assertthat 또는 checkmate과 같은 패키지를 사용하여 코드에서 필요한만큼의 인수 검사를 작성하십시오. 내가 작동하는 최상의 가장 신뢰할 수있는 코드는 약 100 줄의 인수 검사와 코드가 실제로 의도하는 것의 3-4 줄로 구성됩니다. 과잉으로 보일 수도 있지만 사용자가 제공하지 않기를 바라는 잘못된 입력으로 인해 많은 문제를 예방할 수 있습니다.

함수 작성이 끝났 으면이 시점에서 요구 사항리스트 인 을 명시해야합니다. 이 곳에서 testthat 패키지를 사용합니다.

  • 작성한 모든 요구 사항을 충족하는지 테스트를 작성하십시오.
  • 의도하지 않은 입력을 넣지 않고 원하는 결과를 얻을 수 있는지 확인하는 테스트를 작성하십시오.
  • 테스트 데이터에서 의도 한 결과를 얻는 지 확인하는 테스트를 작성하십시오.
  • 생각할 수있는 모든 엣지 케이스를 테스트하는 테스트를 작성하십시오.

이러한 테스트를 모두 작성하는 데 시간이 오래 걸릴 수 있지만 일단 완료되면 기존 요구 사항을 위반하는 테스트가 실패해야하므로 이후 개발을 쉽게 확인 할 수 있습니다.

그런데, 나는 내 자신의 작업에서이 과정을 수행하는 데 정말로 나쁘다. 나는 코드를 작성한 후 내가 한 일을 문서화하는 경향이있다. 하지만 필자가 작성한 최고의 코드는 개념적으로 계획을 세우고, 내 문서를 작성하고, 코딩 한 다음 내 문서에 대해 테스트 한 곳입니다.

+0

이것은 매우 유용하고 철저한 지시입니다. 고마워요! –

1

@ antoine-sac이 링크에서 지적한 바와 같이 프로그래밍 방식으로 확인할 수없는 것들이 있습니다. 예를 들어, 함수가 종료되면.

실용적으로 살펴보면 패키지 assertthattestthat을 살펴보십시오. assertthat은 "between between"결과 확인을 삽입하는 데 도움이되며 testthat은 적절한 테스트를 작성하는 데 도움이됩니다. 예, 테스트를 작성하는 일반적인 방법은 테스트 데이터를 포함하여 작은 테스트 예제를 작성하는 것입니다.

+0

감사합니다. 나는 그것을 시도 할 것입니다. –

관련 문제