Text Analysis with R for Students of Literature provides a practical introduction to computational text analysis using the open source programming language R. Readers begin working with text right away and each chapter works through a new technique or process such that readers gain a broad exposure to core R procedures and a basic understanding of the possibilities of computational text analysis at both the micro and macro scale. View the Book Flyer [pdf 1.4MB]
- Online access (via Springer)
- Order the print version from Springer
- Download the Textbook Materials [18.6 MB .zip](updated 3/15/17)
Introduction to the RStudio Programming Environment [Video].
Corrections:
Page 41 (section 4.4.3). The sentence reading “The key difference is that lapply requires a list as a second arguments, and it requires the name of some other function as a second argument.”
should be
“The key difference is that lapply requires a list as its first arguments, and it requires the name of some other function as a second argument.”
Page 141. The following line of code
if(length(chunks.l[[length(chunk.l)]] <= length(chunks.l[[length(chunk.l)]]/2)
should read
if(length(chunks.l[[length(chunk.l)]]) <= chunk.size/2)
as it does on page 140.
Reviewer Comments
“This is a well written book on the topic of Text Analysis. There is enough information to give you a good start using R. Followed by easy to understand details about text analysis. … This is a good book to have if you are doing text analysis.” (Mary Anne, Cats and Dogs with Data, maryannedata.com, August, 2014)
“A remarkably well-crafted book that will allow students to get a quick start and progress toward quite sophisticated text mining tasks. … exercises provided at the end of each chapter, with solutions at the end of the book, should serve well to help students solidify their knowledge and gain more confidence in their text mining skills. … a great addition to the libraries of digital humanists and natural language enthusiasts who wish to expand their programming literacy … .” (Denilson Barbosa, Computing Reviews, August, 2014)
"This book is an essential resource for anyone who wants to study literature using computational methods."(Mark Algee-Hewitt, Amazon.com, November 2014)
"I can't think of a more qualified person to guide readers through powerful R techniques for text analysis. While extremely useful for people studying literature, these techniques can be also used by anybody working with texts. Even if you simply want to understand how companies and data scientists are analyzing all kinds of texts, go through this book." (Lev Manovich, Department of Computer Science, The Graduate Center, City University of New York & author of The Language of New Media)
"The open source programming language R has become one of the most central statistical and analytical tool in many sciences. While it has already been used in linguistic applications, this book is the first to discuss the application of (corpus-linguistic and other) methods with R in the context of literary studies. The author covers a wide range of descriptive, analytical, and exploratory methods beautifully and in detail in a book that will appeal to a wide and diverse audience of both students and seasoned researchers from literary studies, linguistic computing, and the digital humanities more generally." (Stefan Th. Gries, Department of Linguistics, University of California, Santa Barbara & author of Quantitative corpus linguistics with R: A Practical Introduction)
"This book does a great service for literary scholars interested in computational approaches to text analysis, giving them ready access to powerful methods for exploring patterns and relationships across large quantities of text. Its clear and lucid explanations will also make it an easy textbook to teach from, especially for instructors with prior background who can then use it as a stepping stone to introducing more complex methods. Amateurs and those with little programming background will find it imminently accessible." (Hoyt Long, Department of East Asian Languages and Civilizations, University of Chicago)
"Through my work as an epidemiologist, I encounter electronic health records in an unstructured form (i.e. text), and Text Analysis with R covers many of the initial steps for studying these records. The book is very accessible; it provides a straightforward introduction to manipulating text information without presuming a background in programming or a familiarity with the jargon used in this field. I also appreciated Jockers' thoughtful inclusion of supplemental explanations and information in footnotes throughout the book. For example, text analysis often involves the use of "regular expressions"; a footnote concisely explains wildcard and escape characters and this explanation spared me a fair bit of confusion in my own work. Although I am not a "student of literature", I thought the book contained many generalizable and expertly-taught lessons that make it a valuable introduction to manipulating and analyzing text." (Matthew Maenner, Ph.D.)
"This book is a worthy introduction to computational text analysis, and it fills an important gap in the literature. It’s very accessible and contains plenty of interesting examples and real applications, which have been collected and crafted over the many years the author taught text analysis to undergraduate and graduate students. Although it focuses on the study of literature, I would highly recommend this book to students in business administration and related fields." (Joao Quariguasi Frota Neto, School of Management, University of Bath)
Reader Contributions and Corrections
Thanks to all of those below who provided comments and feedback.
Page | Type | Description | Contributor |
---|---|---|---|
Title page | clarification | With cap or lc the W? Presumably depends on publisher's style. | Charles Shirley |
vii | correction | importantly importantly or important? Use is inconsistent in the book. Being somewhat old-school, I recommend "important." | Charles Shirley |
vii | correction | patters typo | Charles Shirley |
vii | correction | 'toolkit' not 'tool kit' | Yihui Xie |
vii | clarification | Elaborate further on final point about 'new discoveries.' | Alexander Huber |
ix | correction | Baayen and Hadley serial comma before "and"? I think it's included or omitted inconsistently. | Charles Shirley |
x | correction | Knitr; two looks like semicolon should be comma or possibly colon | Charles Shirley |
x | correction | Yihui Xie Dynamic Documents with R and knitr. Chapman and Hall/CRC, 2013. ISBN 978-1482203530. | Yihui Xie |
x | correction | 'Sweave' not 'Sweve.' | Jerid Francom |
6 | correction | 'alongside' not 'along side' | Ashanka Kumari |
6 | clarification | Added footnote reading: 'Console is a word used to refer to a command line window where you enter commands. Sometimes this is called a Terminal or Shell. | John Laudun |
6 | clarification | Added a footnote to clarify what you will see when opening RStudio for the first time: 'Actually, the first time you launch RStudio you will only be able to see three of the panes. The R scripting or Source pane will likely be collapsed so you will only see the word Source until you either create a new script (File > New > R Script) or un-collapse the Source window pane.' | John Laudun |
7 | correction | are determined not an error, but reads like a slight insult; maybe just "decide"? | Charles Shirley |
7 | correction | Linux missing period at end | Charles Shirley |
13 | correction | plaintext should be camel case plainText | Stephen Pentecost |
13 | clarification | Added footnote to explain my variable naming convention, as follows: 'Throughout this book I will use a naming convention when instantiating new R objects. In the example seen here, I have named the object text.v. The .v extension is a convention I have adopted to indicate the R data type of the object, in this case a vector object. This will make more sense as you learn about R's different data types. For now, just understand that you can name R objects in ways that will make sense to you as a human reader of the code.' | Austin Wehrwein |
14 | clarification | By default the 'max.print' option is set to show 10,000 lines so that when entering text.v you will only sees the first 10,000 lines of the book in the console followed by this warning: [ reached getOption('max.print') omitted 8874 entries ]. The max.print options can be reset using options(max.print=1000000) so that you will see the entire text of Moby Dick. | Mark Wolff |
16 | correction | 'shortcut' not 'short cut' and 'shortcutting' not short-cutting' | Ashanka Kumari |
16 | clarification | Added footnote as follows: 'Programming code is extremely finicky. If you do not type the commands exactly as they appear here, you will likely get an error. In my experience about 95\% of the errors and bugs one sees when coding are the result of careless typing. If the program is not responding the way you expect or if you are getting errors, check your typing. Everything counts: capital letters must be consistently capitalized, commas between arguments must be out side of the quotes and so on. | John Laudun |
16 | correction | forth typo; should be "fourth" | Charles Shirley |
16 | correction | in stylistic note: through the book I saw a number of cases like this "in between" where the unnecessary preposition creates a colloquial flavor; recommend thinking about whether the intended audience will notice or object | Charles Shirley |
17 | correction | book;-) hmmm...what terminal punctuation, if any, should be used with an emoticon? interesting question, definitely no old-school answer! | Charles Shirley |
18 | correction | expression typo, should be plural | Charles Shirley |
19 | clarification | Added page reference to footnote to page 136 where better regular expression gets explained. | Alexander Huber |
19 | correction | help would it be appropriate to mention RStudio's help tab? once I discovered it, I found myself using it constantly | Charles Shirley |
19 | correction | internet normal practice seems to be initial cap | Charles Shirley |
20 | correction | 'occurrences' not 'occurecnes' in code sample. | Mikal Brotnov |
20 | correction | 'an object ' not 'a object' | Matthew J Maenner |
20 | correction | <- query for here and elsewhere: will inconsistent spacing around <- seem sloppy to intended readers? is it worth mentioning RStudio's handy shortcut of alt-hyphen to type the <- plus a space before and after? | Charles Shirley |
20 | correction | gut check isn't "gut check" usually about courage? maybe also intuition, which fits here, but I found the phrase distracting | Charles Shirley |
21 | correction | 'into a vector of words' not 'into vector of words' | John Laudun |
21 | correction | whale higher on page, "whale" as word of interest is in quotes, not italic; minor inconsistency, likely not worth worrying about | Charles Shirley |
21 | correction | list since lists are a data type often used in the book, maybe don't use it loosely here; just "will return the index positions"? | Charles Shirley |
22 | clarification | When entering whale.hits.v/total.words.v the textbook shows the result rounded to the sixth decimal place. You will see the result rounded to the seventh in your console. This difference was the result of using the knitr package for production of the textbook document. I have added an option to correct this discrepancy. | Mark Wolff |
22 | clarification | Added a footnote to clarify that there is a more elegant way to calculate the length of the hits for whale without using which() as in: length(moby.word.v[moby.word.v=='whale']) . Even though it is verbose, I'll continue to use which in the example because I think which is easier for a beginner to understand. | Yihui Xie |
22 | correction | length(unique(moby.word.v)) should be 16871. | Ashanka Kumari |
22 | correction | 'comments into code' not 'comments into to code' | Brandon Hawk |
22 | correction | occurecnes typo in code sample | Charles Shirley |
23 | correction | seems like I've seen cautions against using T or F for TRUE or FALSE | Charles Shirley |
24 | correction | Unnecessary question mark changed to period. | Ashanka Kumari |
24 | clarification | Added note about adjusting the size of the plotting pane in RStudio so as to avoid 'Error in plot.new() : figure margins too large'. | Austin Wehrwein |
24 | correction | novel? sentence isn't a question; replace ? with period | Charles Shirley |
25 | correction | recycling and recommend at least a comma after "recycling" because the two halves of the compound sentence are such different topics; maybe even make two sentences? | Charles Shirley |
26 | correction | tabled a bit distracting to see data type used as participle; no big objection, just including my personal reaction | Charles Shirley |
27 | clarification | New text explaining the use of the axis() and names() functions as follows: Here I'll add a few more arguments to plot in order to convey more information about the resulting image, and I'll call the axis function to reset the values on the x-axis with the names of the top ten words. Notice that the names function can be used to set, or in this case, get the names of an object. | Carmen McCue |
27 | correction | asterisks an asterisk rather than "the asterisks"? | Charles Shirley |
27 | correction | two 3.2 to specify exercise number | Charles Shirley |
28 | correction | Exercise 1 probably needs a more precise reference; 1.X? | Charles Shirley |
31 | correction | 'You now need to create a sequence of numbers from 1 to n, where n is the position, or index number, of the last word in Moby Dick' not You now need to create a sequence of numbers from 1 to n, where n is the position, or index number) of last word in Moby Dick.' | Ashanka Kumari |
31 | correction | If elsewhere in book, R words at beginning of sentence are lower-cased if that's the correct R form | Charles Shirley |
31 | correction | one, ten seems more appropriate to use 1, 10 | Charles Shirley |
32 | correction | The text regarding TRUE, FALSE and NA has been revised as follows: 'Another vector containing the values for plotting on the y-axis is now needed, and in this case, the values need only be some reflection of the logical condition of TRUE where a whale is found and FALSE or none found when an instance of whale is not found. In R you can represent the logical value TRUE with a number 1 and FALSE with a 0. Here, however, since we are not really counting items but, instead, noting their presense or absence, I'll introduce a special character sequence NA as in 'not available' for places where there is no found match.' | Alexander Huber |
32 | clarification | Moved code for plotting 'simple plot of whale' to page 32 and added reference to figure 4.1 | Brandon Hawk |
32 | correction | NA inconsistent spacing around dashes | Charles Shirley |
33 | correction | separate and 'occurrences' are misspelled. | Ashanka Kumari |
33 | correction | seperate typo in code sample | Charles Shirley |
34 | correction | instantiated probably OK, but "instantiated" may confuse some readers; meaning becomes clear from context as the word is used through the book | Charles Shirley |
35 | correction | Unecessary use of unlist in code reading novel.lines.v<-unlist(novel.lines.v). novel.lines.v is already a vector. | Charles Shirley |
35 | correction | 'Now identify the chapter break positions in the vector using the grep function' not 'Now identify the chapter break positions in the list using the grep function' | Carmen McCue |
35 | correction | As written, the code in the for loop that follows on page 39 will fail to capture the last line of the novel. To remedy this error, both the text instructions and the code need modification. The instructions on this page now read as follows: 'This technique works perfectly except for the last chapter where there is no following chapter! There are several ways you might address this situation, but a simple solution is to just add one more line to the novel.lines.v object and then add the position of this new line to the chap.positions.v vector. You will find that last position easily enough with the length function.' Item #2 of the list that follows has been modified to read:'Add a new item to the end of the novel.lines.v object using the c funciton. Here I have set the value of that last item to END. You will see later on that this last item serves to mark the end boundry for the last chapter. Now get the last position using the length function and add it to the chap.positions.v vector using the c function:' The code in item #2 is rewritten as follows:
novel.lines.v <- c(novel.lines.v, "END") last.position.v <- length(novel.lines.v) chap.positions.v <- c(chap.positions.v , last.position.v) | Carmen McCue |
38 | correction | Missing the word 'to' in 'To summarize, the for loop will need to iterate over each item' | Ashanka Kumari |
38 | correction | need iterate looks like "need" is extraneous | Charles Shirley |
39 | clarification | Moved description of list object to chapter two (page 18) where list objects are first introduced. | Kevin McMullen |
39 | correction | pauses suggests the user will notice the code pause in execution; actual meaning seems to be a "pause" in the logic | Charles Shirley |
40 | correction | Extra 'to' in sentence 'I must -to- add 1 to i in its capacity as an index' | Ashanka Kumari |
40 | correction | Missing 'v' in object name 'novel.lines.v' | Ashanka Kumari |
42 | correction | 'each of the drawers contains an integer vector' not 'each of the drawers contains is an integer vector' | Carmen McCue |
42 | correction | 'R will keep recycling from the shorter vector until it reaches the end of the process' not 'R will keep recycling from the longer vector until it reaches the end of the process' | Carmen McCue |
42 | correction | Sometimes not 'Sometime' | Ashanka Kumari |
42 | correction | Sometime missing s on end | Charles Shirley |
42 | correction | incredibly too colloquial? | Charles Shirley |
43 | correction | Missing 'v' in object name 'novel.lines.v' | Ashanka Kumari |
43 | correction | Missing the word 'the' between 'by' and 'first' and again between 'by' and 'second' | Ashanka Kumari |
43 | correction | Missing the word 'one' in 'a file cabinet with three drawers, and each one of the drawers contains an integer vector' | Ashanka Kumari |
43 | correction | bracketed sub setting I think it's usually sub-setting elsewhere; my personal preference is subsetting | Charles Shirley |
44 | correction | sub setting inconsistent use with and without hyphen in this paragraph | Charles Shirley |
44 | correction | called, comma splice, or just informal? | Charles Shirley |
46 | correction | 'simpler object' not 'simpler objects' | Ashanka Kumari |
46 | clarification | The columns in matrix objects are already vectors, so using the as.vector function here is unnecessary. | NA |
46 | correction | an even simpler vector objects should be singular: "object" | Charles Shirley |
48 | correction | i.e. looks like e.g. fits the meaning better | Charles Shirley |
49 | clarification | Added brief discussion and example of correlation coefficient used in literary context. | Alexander Huber |
50 | correction | 'you need to replace the NA values' not 'you need to replace with these NA values' | Ashanka Kumari |
52 | correction | See lowercase: see | Charles Shirley |
52 | correction | 1s seen in various places, just noted here: font for numerals often looks like that for R words rather than normal text; seems a bit odd to me, but no big deal; in this case, maybe better to use apostrophy: 1's | Charles Shirley |
53 | correction | short hand shorthand (one word), I think | Charles Shirley |
53 | correction | now Needs initial cap: "Now" | Charles Shirley |
54 | correction | Once in random order, you'll an old-school bugaboo: introductory phrase referring to something other than the next word | Charles Shirley |
56 | correction | once run needs initial cap (also another introductory-phrase violation, for readers who feel violated) | Charles Shirley |
56 | correction | [Wikipedia URL] looks like all-caps is unintentional | Charles Shirley |
61 | correction | 'Students frequently' not 'Students frequency' | Alexander Huber |
61 | correction | 'chapters of the novel' not 'chapters of he novel' | Brandon Hawk |
61 | correction | 'chapter.freqs.l' not 'chapter.list.freqs' | Brandon Hawk |
61 | correction | frequency typo; should be "frequently" | Charles Shirley |
61 | correction | token shouldn't it be "type"? | Charles Shirley |
63 | correction | An should be "A" | Charles Shirley |
67 | correction | 'how to use R's' not 'how use R's' | Brandon Hawk |
67 | correction | 'provide lapply' not 'provide lappy' | Brandon Hawk |
67 | correction | fourth' not 'forth' | Kimberley Tedrow |
67 | correction | how use should be "how to use" | Charles Shirley |
68 | correction | revered a delightful typo, but alas, should be "reversed" | Charles Shirley |
69 | correction | in not n | Ashanka Kumari |
68 | correction | follow, provide here and some similar instances, the comma seems unnecessary and possibly wrong (though a perfectly good 18th-19th century practice that I regret being out of fashion) | Charles Shirley |
69 | correction | result? period, not ? | Charles Shirley |
72 | clarification | chapter.lengths.m is created only as part of a practice exercise (6.1) and not in the main text, so text here now includes reminder from exercise. | Alexander Huber |
72 | correction | this looks like a colon is needed; noticed similar omissions in various places, not sure they're all included in this list | Charles Shirley |
74 | correction | incredibly that word again; author's choice, of course | Charles Shirley |
75 | correction | Citation for Firth is incomplete. | Alexander Huber |
75 | correction | you access appears it should be "you to access" | Charles Shirley |
75 | correction | relative path unfamiliar term for many readers; like "instantiate," becomes clearer as it is reused; may or may not be worth inserting a brief explanation | Charles Shirley |
76 | correction | function, function better to omit comma and depend on font/face difference to separate the words visually? | Charles Shirley |
76 | correction | Improve the regular expression for finding files with a '.txt' file extension as: '\\.txt$ | NA |
77 | correction | with of rather than "with"? or "objective of using"? | Charles Shirley |
77 | correction | command + return would suggest adding Windows keystrokes, which I think are Ctrl + Enter | Charles Shirley |
80 | correction | file needs colon: "file:" | Charles Shirley |
83 | correction | abstract another technical term; not likely to be a serious problem, but potentially confusing to someone who is still worrying about the basics of coding | Charles Shirley |
84 | correction | 's check the font; is it as intended? | Charles Shirley |
84 | correction | return back the hits another old-school bugaboo; just "return the hits"? | Charles Shirley |
84 | correction | widowing another wonderful typo... | Charles Shirley |
85 | correction | Published doesn't need initial cap (three instances in the two code samples) | Charles Shirley |
86 | correction | see, Enter question mark rather than comma | Charles Shirley |
91 | correction | internet internet/Internet again; if instances noted in this list are changed, better do a global search to avoid inconsistency in case I didn't indicate them all | Charles Shirley |
91 | correction | OCR correct font? | Charles Shirley |
91 | correction | in is, not in (is not perfect) | Charles Shirley |
91 | correction | or of, not or (margin of error) | Charles Shirley |
92 | correction | along side alongside probably preferable | Charles Shirley |
92 | correction | URL in footnote maybe OK, but in present pagination (footnote starting on p. 91), may look like a stray footnote | Charles Shirley |
93 | correction | get seems (too?) colloquial | Charles Shirley |
94 | correction | you should be "your" | Charles Shirley |
94 | correction | 'chapter' first single quote needs to be reversed (or changed to straight quotes like the rest of the expression) | Charles Shirley |
95 | clarification | I have not explained why I chose 'd' as the name for the TEI namespace (the decision was arbitrary). I have now changed it to the slightly more verbose but clearer 'tei.' | Alexander Huber |
95 | correction | the third argument see note in PDF; "The third argument" confused me | Charles Shirley |
95 | correction | namespace in code sample: should "namespace" be "namespaces"? | Charles Shirley |
96 | correction | because they not 'because the' | Alexander Huber |
96 | correction | with help from grep hard to be sure whether the phrase modifies "did previously" or "you can put..." | Charles Shirley |
96 | correction | the typo: should be "they" | Charles Shirley |
104 | correction | above: typo: period, not colon | Charles Shirley |
104 | correction | non isn't it "not available"? | Charles Shirley |
108 | correction | xpath normal form seems to be XPath | Charles Shirley |
108 | correction | a an, to match pronunciation? | Charles Shirley |
108 | correction | 'doc.object' not 'doc' | Alexander Huber |
109 | correction | up colloquialism "chunks up" may be misread as chunks / up the string | Charles Shirley |
109 | correction | read needs colon | Charles Shirley |
110 | correction | bi-grams normally written without hyphen? | Charles Shirley |
110 | correction | 67 footnote needs closing period | Charles Shirley |
112 | correction | Formula squares | Alexander Huber |
112 | correction | ultimately repetition in two sentences seems awkward | Charles Shirley |
112 | correction | five-hundred hyphen not needed | Charles Shirley |
112 | correction | Formula needs correction | Charles Shirley |
114 | correction | factors may be worth mentioning factors will be explained in a later section | Charles Shirley |
117 | correction | adequate: period, not colon | Charles Shirley |
117 | correction | code: sentence continues after the code snippet, so colon seems wrong here | Charles Shirley |
119 | correction | document document's? | Charles Shirley |
121 | correction | built in built-in? | Charles Shirley |
122 | correction | items, each separate into two sentences? | Charles Shirley |
122 | correction | corresponding one-tenth missing "to" | Charles Shirley |
123 | correction | items which you can ascertain items, as you can ascertain? | Charles Shirley |
124 | correction | allows delete "allows" | Charles Shirley |
130 | correction | function missing period at end of sentence | Charles Shirley |
130 | correction | Rybinci Rybicki, isn't it? | Charles Shirley |
130 | correction | site: needs space after colon | Charles Shirley |
133 | correction | 'I was calling' not 'I calling' | Alexander Huber |
133 | correction | LSA Latent LSA, or or something else to connect acronym and term | Charles Shirley |
134 | correction | 'was a dazzling' not 'was dazzling' | Alexander Huber |
134 | correction | importantly similar phrase is "more important" somewhere else (old-school stylists taught me to prefer "more important") | Charles Shirley |
134 | correction | total, most connecting clauses with comma seems awkward, could reduce to "mostly novels" | Charles Shirley |
134 | correction | works, extraneous comma | Charles Shirley |
136 | correction | that use an apostrophe, maybe "... possessives that use apostrophes get split" (or "are split" for slightly more formality) | Charles Shirley |
136 | correction | straight-forward no hyphen | Charles Shirley |
138 | correction | all need appears to be missing "you" | Charles Shirley |
139 | clarification | A more computationally efficient method for achieving this same result can be done by building a list object inside the loop and then using do.call to rbind the list elements. The code for this could be written as follows:
The code for this could be written as follows:
topic.l<-NULL for(i in 1:length(files.v)){ doc.object<-xmlTreeParse(file.path(inputDir, files.v[i]), useInternalNodes=TRUE) chunk.m<-makeFlexTextChunks(doc.object, chunk.size, percentage=FALSE) textname<-gsub(""\\..*"","""", files.v[i]) segments.m<-cbind(paste(textname, segment=1:nrow(chunk.m), sep=""_""), chunk.m) topic.l[[textname]]<-segments.m } topic.m<-do.call(rbind, topic.l) | Paul Johnson |
139 | correction | number should be plural | Charles Shirley |
141 | correction | unicode usually capped, I think; the unicode.org website spells it as Unicode | Charles Shirley |
141 | correction | solutions, comma between subject and predicate | Charles Shirley |
142 | correction | method personal note: I found the term "method" baffling when I first encountered it while trying to write Excel macros; nothing to suggest here, but thought it worth pointing out that others may be baffled | Charles Shirley |
142 | correction | token should be plural | Charles Shirley |
143 | correction | Output and description of output from calling head(word.freqs) differ. | Alexander Huber |
144 | correction | begin...Begin repetition is awkward | Charles Shirley |
144 | correction | edu/ extraneous space in URL | Charles Shirley |
147 | correction | mind, comma not needed | Charles Shirley |
147 | correction | function needs comma after "function" | Charles Shirley |
147 | correction | see needs initial cap | Charles Shirley |
147 | correction | just recommend deleting "just" | Charles Shirley |
148 | correction | real change to "really" for slightly less colloquial flavor (or even delete) | Charles Shirley |
149 | correction | able assign missing "to" | Charles Shirley |
149 | correction | proportion, comma between subject and predicate | Charles Shirley |
149 | correction | that: delete either "that" or colon | Charles Shirley |
149 | correction | Friends topic would be easier to read as "...Friends, topic..." | Charles Shirley |
149 | correction | .36. quote needs to be closed | Charles Shirley |
150 | correction | .df needs colon to introduce code snippet | Charles Shirley |
151 | correction | Scatter should be "Bar" | Charles Shirley |
152 | correction | this : extraneous space before colon | Charles Shirley |
153 | correction | characters initial-cap (or lowercase "Main") | Charles Shirley |
156 | correction | file should be plural | Charles Shirley |
Draft ManuscriptBook is now in production and no longer available as draft.Textbook MaterialsMaterials are being updated for final production.