1 / 200 * 30
#> [1] 0.15
(59 + 73 + 2) / 3
#> [1] 44.66667
sin(pi / 2)
#> [1] 12 워크플로우: 기초
이제 R 코드를 실행하는 경험을 조금 해보셨을 겁니다. 자세한 내용은 많이 알려드리지 않았지만, 기본은 확실히 파악하셨거나, 아니면 좌절해서 이 책을 던져버렸을 수도 있겠네요! R 프로그래밍을 시작할 때 좌절하는 것은 자연스러운 일입니다. R은 구두점에 매우 엄격해서 문자 하나만 틀려도 불평을 쏟아내기 때문입니다. 하지만 조금 좌절할 것을 예상해야 하지만, 이러한 경험은 일반적이고 일시적이라는 점에 위안을 삼으세요. 누구에게나 일어나는 일이며, 극복하는 유일한 방법은 계속 시도하는 것입니다.
더 진행하기 전에, R 코드를 실행하는 탄탄한 기초를 갖추었는지, 그리고 가장 유용한 RStudio 기능 중 일부를 알고 있는지 확인해 봅시다.
2.1 코딩 기초
가능한 한 빨리 플롯을 그리게 하기 위해 생략했던 몇 가지 기초를 검토해 봅시다. R을 사용하여 기본적인 수학 계산을 할 수 있습니다:
할당 연산자 <-를 사용하여 새 객체를 만들 수 있습니다:
x <- 3 * 4x의 값은 출력되지 않고 저장만 된다는 점에 유의하세요. 값을 보려면 콘솔에 x를 입력하세요.
c()를 사용하여 여러 요소를 벡터로 결합(combine) 할 수 있습니다:
primes <- c(2, 3, 5, 7, 11, 13)그리고 벡터에 대한 기본 산술 연산은 벡터의 모든 요소에 적용됩니다:
primes * 2
#> [1] 4 6 10 14 22 26
primes - 1
#> [1] 1 2 4 6 10 12객체를 생성하는 모든 R 구문, 즉 할당(assignment) 구문은 동일한 형식을 갖습니다:
object_name <- value이 코드를 읽을 때는 머릿속으로 “객체 이름이 값을 얻는다(gets)”라고 말하세요.
많은 할당을 하게 될 텐데, <-는 타이핑하기 귀찮습니다. RStudio의 키보드 단축키인 Alt + - (빼기 기호)를 사용하면 시간을 절약할 수 있습니다. RStudio가 자동으로 <- 주위에 공백을 넣는데, 이는 좋은 코드 서식 관행입니다. 코드는 좋은 날에도 읽기 끔찍할 수 있으니, 눈을쉬게해주고 공백을 사용하세요.
2.2 주석
R은 해당 줄의 # 뒤에 있는 모든 텍스트를 무시합니다. 이를 통해 주석(comments), 즉 R은 무시하지만 다른 사람은 읽을 수 있는 텍스트를 작성할 수 있습니다. 때때로 코드에서 무슨 일이 일어나고 있는지 설명하는 주석을 예제에 포함할 것입니다.
주석은 다음 코드가 수행하는 작업을 간략하게 설명하는 데 도움이 될 수 있습니다.
# 소수 벡터 생성
primes <- c(2, 3, 5, 7, 11, 13)
# 소수에 2를 곱함
primes * 2
#> [1] 4 6 10 14 22 26이런 짧은 코드 조각의 경우, 코드 한 줄 한 줄마다 주석을 남길 필요는 없을 수 있습니다. 하지만 작성하는 코드가 더 복잡해짐에 따라, 주석은 여러분(과 여러분의 협업자)이 코드에서 수행된 작업을 파악하는 데 많은 시간을 절약해 줄 수 있습니다.
주석을 사용하여 코드의 방법이나 무엇이 아니라 이유를 설명하세요. 코드의 무엇과 방법은, 비록 지루할지라도 주의 깊게 읽으면 항상 파악할 수 있습니다. 모든 단계를 주석에 설명하고 나중에 코드를 변경하면, 주석도 업데이트해야 한다는 것을 기억해야 합니다. 그렇지 않으면 나중에 코드로 돌아왔을 때 혼란스러울 것입니다.
어떤 일이 왜 수행되었는지 파악하는 것은 불가능하지는 않더라도 훨씬 더 어렵습니다. 예를 들어, geom_smooth()에는 곡선의 부드러움을 제어하는 span이라는 인수가 있으며, 값이 클수록 더 부드러운 곡선이 생성됩니다. span 값을 기본값 0.75에서 0.9로 변경하기로 결정했다고 가정해 봅시다. 미래의 독자가 무엇이 일어나고 있는지 이해하기는 쉽지만, 주석에 생각을 적어두지 않으면 아무도 왜 기본값을 변경했는지 이해하지 못할 것입니다.
데이터 분석 코드의 경우, 주석을 사용하여 전반적인 공격 계획을 설명하고 중요한 통찰력을 발견했을 때 기록하세요. 코드 자체에서 이러한 지식을 다시 포착할 수 있는 방법은 없습니다.
2.3 이름에는 무엇이 들어 있나요?
객체 이름은 문자로 시작해야 하며 문자, 숫자, _, .만 포함할 수 있습니다. 객체 이름이 서술적이기를 원하므로 여러 단어에 대한 규칙을 채택해야 합니다. 소문자 단어를 _로 구분하는 스네이크 케이스(snake_case) 를 권장합니다.
i_use_snake_case
otherPeopleUseCamelCase
some.people.use.periods
And_aFew.People_RENOUNCEconvention코드 스타일을 논의할 때 Chapter 4 에서 이름에 대해 다시 다룰 것입니다.
객체 이름을 입력하여 객체를 검사할 수 있습니다:
x
#> [1] 12또 다른 할당을 해봅시다:
this_is_a_really_long_name <- 2.5이 객체를 검사하려면 RStudio의 자동 완성 기능을 사용해 보세요. “this”를 입력하고 TAB을 누른 다음, 고유한 접두사가 될 때까지 문자를 추가하고 엔터를 누르세요.
실수를 했고 this_is_a_really_long_name의 값이 2.5가 아니라 3.5여야 한다고 가정해 봅시다. 또 다른 키보드 단축키를 사용하여 수정할 수 있습니다. 예를 들어 ↑를 눌러 마지막으로 입력한 명령을 불러와 편집할 수 있습니다. 또는 “this”를 입력한 다음 Cmd/Ctrl + ↑를 눌러 해당 문자로 시작하는 입력한 모든 명령을 나열합니다. 화살표 키를 사용하여 탐색한 다음 엔터를 눌러 명령을 다시 입력하세요. 2.5를 3.5로 변경하고 다시 실행하세요.
또 다른 할당을 해봅시다:
r_rocks <- 2^3검사해 봅시다:
r_rock
#> Error: object 'r_rock' not found
R_rocks
#> Error: object 'R_rocks' not found이것은 여러분과 R 사이의 암시적 계약을 보여줍니다. R은 지루한 계산을 대신 해주지만, 그 대가로 여러분은 지시사항을 완전히 정확하게 전달해야 합니다. 그렇지 않으면 찾고 있는 객체를 찾을 수 없다는 오류가 발생할 가능성이 큽니다. 오타는 중요합니다. R은 여러분의 마음을 읽고 “r_rock을 입력했을 때 아마 r_rocks를 의미했을 거야”라고 말할 수 없습니다. 대소문자는 중요합니다. 마찬가지로 R은 여러분의 마음을 읽고 “R_rocks를 입력했을 때 아마 r_rocks를 의미했을 거야”라고 말할 수 없습니다.
2.4 함수 호출
R에는 다음과 같이 호출되는 방대한 내장 함수 모음이 있습니다:
function_name(argument1 = value1, argument2 = value2, ...)숫자의 정규 시퀀스(sequences) 를 만드는 seq()를 사용해 보고, RStudio의 더 유용한 기능을 알아봅시다. se를 입력하고 TAB을 누르세요. 팝업에 가능한 완성 목록이 표시됩니다. 더 입력(q)하여 명확히 하거나 ↑/↓ 화살표를 사용하여 선택하여 seq()를 지정하세요. 함수의 인수와 목적을 상기시켜주는 팝업 도구 설명을 주목하세요. 더 많은 도움이 필요하면 F1을 눌러 오른쪽 아래 창의 도움말 탭에서 모든 세부 정보를 확인하세요.
원하는 함수를 선택했으면 TAB을 다시 누르세요. RStudio가 짝이 맞는 여는 괄호(()와 닫는 괄호())를 추가해 줍니다. 첫 번째 인수의 이름인 from을 입력하고 1로 설정하세요. 그런 다음 두 번째 인수의 이름인 to를 입력하고 10으로 설정하세요. 마지막으로 엔터를 치세요.
seq(from = 1, to = 10)
#> [1] 1 2 3 4 5 6 7 8 9 10우리는 종종 함수 호출에서 처음 몇 개의 인수 이름을 생략하므로, 다음과 같이 다시 쓸 수 있습니다:
seq(1, 10)
#> [1] 1 2 3 4 5 6 7 8 9 10다음 코드를 입력하고 RStudio가 짝이 맞는 따옴표로 비슷한 도움을 제공한다는 것을 확인하세요:
x <- "hello world"따옴표와 괄호는 항상 쌍으로 와야 합니다. RStudio가 최선을 다해 도와주지만, 여전히 엉망이 되어 불일치가 발생할 수 있습니다. 이 경우 R은 연속 문자 “+”를 보여줍니다:
> x <- "hello
+
+는 R이 더 많은 입력을 기다리고 있음을 알려줍니다. 아직 완료되지 않았다고 생각하는 것입니다. 일반적으로 이는 "나 ) 중 하나를 잊어버렸음을 의미합니다. 누락된 쌍을 추가하거나 ESCAPE를 눌러 표현식을 중단하고 다시 시도하세요.
오른쪽 상단 창의 환경 탭에는 생성한 모든 객체가 표시됩니다:
2.5 연습문제
-
이 코드가 작동하지 않는 이유는 무엇입니까?
my_variable <- 10 my_varıable #> Error: object 'my_varıable' not found주의 깊게 보세요! (무의미한 연습처럼 보일 수 있지만, 아주 작은 차이도 알아차리도록 뇌를 훈련하는 것은 프로그래밍할 때 큰 도움이 될 것입니다.)
-
다음 R 명령을 각각 올바르게 실행되도록 수정하세요:
libary(todyverse) ggplot(dTA = mpg) + geom_point(maping = aes(x = displ y = hwy)) + geom_smooth(method = "lm) Option + Shift + K / Alt + Shift + K를 누르세요. 어떤 일이 일어납니까? 메뉴를 사용하여 같은 곳으로 이동하려면 어떻게 해야 합니까?
-
Section 1.6 의 연습문제를 다시 살펴봅시다. 다음 코드 줄을 실행하세요. 두 플롯 중 어느 것이
mpg-plot.png로 저장됩니까? 그 이유는 무엇입니까?my_bar_plot <- ggplot(mpg, aes(x = class)) + geom_bar() my_scatter_plot <- ggplot(mpg, aes(x = cty, y = hwy)) + geom_point() ggsave(filename = "mpg-plot.png", plot = my_bar_plot)
2.6 요약
이제 R 코드가 작동하는 방식에 대해 조금 더 배웠고, 나중에 다시 볼 때 코드를 이해하는 데 도움이 되는 몇 가지 팁을 배웠습니다. 다음 장에서는 중요한 변수 선택, 관심 있는 행 필터링, 요약 통계 계산 등 데이터를 변형하는 데 도움이 되는 tidyverse 패키지인 dplyr에 대해 가르쳐 데이터 과학 여정을 계속할 것입니다.