Below is a step-by-step guide on how to run the R script.

#set working directory to $HOME/Desktop/proof-of-concept
#setwd("/Users/sophieavard/Desktop/proof-of-concept")

You need to set your working directory to the proof-of-concept folder (which should be saved on your Desktop).

getwd()
[1] "/Users/sophieavard/Desktop/Sophie-Avard-Proof-of-Concept/proof-of-concept"
install.packages('plyr', repos = "http://cran.us.r-project.org")
Installing package into ‘/Users/sophieavard/Desktop/Sophie-Avard-Proof-of-Concept/proof-of-concept/renv/library/R-3.6/x86_64-apple-darwin15.6.0’
(as ‘lib’ is unspecified)
cannot open URL 'http://cran.cnr.berkeley.edu/bin/macosx/el-capitan/contrib/3.6/PACKAGES.rds': HTTP status was '404 Not Found'trying URL 'http://cran.us.r-project.org/bin/macosx/el-capitan/contrib/3.6/plyr_1.8.4.tgz'
Content type 'application/x-gzip' length 965992 bytes (943 KB)
==================================================
downloaded 943 KB

The downloaded binary packages are in
    /var/folders/dc/ynp6mgyd67s_7ydkkh8lrylr0000gn/T//RtmpUePfcE/downloaded_packages
install.packages("pdftools")
The following package(s) are missing their DESCRIPTION files:

    packrat 2
    pdftools 10
    pdftools 11
    pdftools 12
    pdftools 13
    pdftools 14
    pdftools 15
    pdftools 16
    pdftools 2
    pdftools 3
    pdftools 4
    pdftools 5
    pdftools 6
    pdftools 7
    pdftools 8
    pdftools 9

Consider removing or re-installing these packages.
Library: "~/Desktop/Sophie-Avard-Proof-of-Concept/proof-of-concept/renv/library/R-3.6/x86_64-apple-darwin15.6.0"

Installing pdftools [2.2] ...
    OK (linked cache)
library(pdftools)

install.packages("devtools")
The following package(s) are missing their DESCRIPTION files:

    packrat 2
    pdftools 10
    pdftools 11
    pdftools 12
    pdftools 13
    pdftools 14
    pdftools 15
    pdftools 16
    pdftools 2
    pdftools 3
    pdftools 4
    pdftools 5
    pdftools 6
    pdftools 7
    pdftools 8
    pdftools 9

Consider removing or re-installing these packages.
Library: "~/Desktop/Sophie-Avard-Proof-of-Concept/proof-of-concept/renv/library/R-3.6/x86_64-apple-darwin15.6.0"

Installing devtools [2.2.1] ...
    OK (linked cache)
devtools::install_github("ropenscilabs/qcoder")
Skipping install of 'qcoder' from a github remote, the SHA1 (96e424bb) has not changed since last install.
  Use `force = TRUE` to force installation
library(qcoder)

Install all of the packages needed for this proof of concept. The pdftools packages allows users to convert pdfs to text files. The devtools package makes package development easier as it provides R functions that simplify common tasks. The last two lines of the script installs the textual analysis package ‘qcoder’.

file.names <- dir(path="pdfs", pattern =".pdf", full.names=TRUE)

This creates a variable called file.names that builds a path to the pdfs that need to be converted into txt files. ‘Path=’ is the directory containing the files and ‘pattern=’ is the pattern of the files - in this case the files all end in “.pdf”. If full.names=TRUE, the directory path is prepended to the file names to give a relative file path, if FALSE, the file names are returned.

for (file in file.names) {
  text <- pdf_text(file)

  
  output.file <- gsub("pdf", "txt",file)
  print(output.file)
  print(file)
  write(text, output.file)
}
[1] "txts/Fabian_2018.txt"
[1] "pdfs/Fabian_2018.pdf"
[1] "txts/Robinson_2018.txt"
[1] "pdfs/Robinson_2018.pdf"

For loops are used to repeat a specific block of code. In this for loop, we are repeating the sequence of text <- pdf_txt(file) for each file within file.names (that is, within the pdfs directory).

The gsub function finds all matches of a string and replaces it with the new string. That is, in file all occurrences of “pdf” will be replaced with “txt” - this will create a variable called output.files.

The print() function is an argument that prints the string on the console

The write() function writes the data to a file. That is, ‘text’ is the data to be written out and ‘output.file’ is the string naming the file to write to (in this case, “txt”)

#create_qcoder_project("qcoder-analysis-project")

import_project_data(project = "qcoder-analysis-project")

The ‘create’ function is used when users want to create an empty qcoder analysis. The ‘import’ function is used when users when to open an existing analysis. For the purposes of this PoC only the ‘import’ function will be used.

‘Project=’ is the name of the qcoder analysis.

project_name = "qcoder-analysis-project"
file_name <- "Fabian_2018.txt"
docs_df_path <-"qcoder-analysis-project/data_frames/qcoder_documents_qcoder-analysis-project.rds"
codes_df_path <- "qcoder-analysis-project/data_frames/qcoder_codes_qcoder-analysis-project.rds"
file_path <- "qcoder-analysis-project/documents"
dir("qcoder-analysis-project/documents")
[1] "Fabian_2018.txt"   "Robinson_2018.txt"

file_name builds a path to the data docs_df_path builds a path to the directory that holds the data codes_df_path builds a path to the codes file_path builds a path to the directory holding the files

rawPath <- "~/Desktop/Sophie-Avard-Proof-of-Concept/proof-of-concept/txts"
datafiles <- dir(rawPath, "*.txt", ignore.case = TRUE, all.files = TRUE)

file.copy(file.path(rawPath, datafiles), file_path, overwrite = TRUE)
[1] TRUE TRUE

rawPath builds a path to the directory holding the txt files - make sure you change this to the path of the ‘proof-of-concept’ folder (located on your Desktop) datafiles builds a path to the files containing “.txt” within the rawPath ignore.case = TRUE constructs a case insensitive pattern

The ‘file.copy’ function creates a copy of of the datafiles within the rawPath and places them within the file_path (“qcoder-analysis-project/documents”).

new_dataframe <- readRDS(docs_df_path)

This proves that the data is ‘in’ the system as it writes a single R object (docs_df_path) to a file, and restores the object as new_dataframe.

read_code_data(project_name = project_name)

This reads the csv file containing the codes within the project

codes_dataframe <- readRDS(codes_df_path)

This loads the codes into R

qcode(use_wd=TRUE)
Loading required package: shiny
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union


Attaching package: ‘rlang’

The following object is masked from ‘package:magrittr’:

    set_names

Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘DT’

The following objects are masked from ‘package:shiny’:

    dataTableOutput, renderDataTable

Watch shinyjs tutorial videos and read the full documentation:
    https://deanattali.com/shinyjs

Attaching package: ‘shinyjs’

The following object is masked from ‘package:shiny’:

    runExample

The following objects are masked from ‘package:methods’:

    removeClass, show

here() starts at /Users/sophieavard/Library/Application Support/renv/cache/v4/R-3.6/x86_64-apple-darwin15.6.0/qcoder/0.1.0/7cc7c1d931e831a340220be996967cd2/qcoder
NA

This connects the Shiny app to the working directory and then opens it.

LS0tCnRpdGxlOiAiUG9DIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCkJlbG93IGlzIGEgc3RlcC1ieS1zdGVwIGd1aWRlIG9uIGhvdyB0byBydW4gdGhlIFIgc2NyaXB0LgoKYGBge3J9CiNzZXQgd29ya2luZyBkaXJlY3RvcnkgdG8gJEhPTUUvRGVza3RvcC9wcm9vZi1vZi1jb25jZXB0CiNzZXR3ZCgiL1VzZXJzL3NvcGhpZWF2YXJkL0Rlc2t0b3AvcHJvb2Ytb2YtY29uY2VwdCIpCmBgYApZb3UgbmVlZCB0byBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcHJvb2Ytb2YtY29uY2VwdCBmb2xkZXIgKHdoaWNoIHNob3VsZCBiZSBzYXZlZCBvbiB5b3VyIERlc2t0b3ApLiAKCmBgYHtyfQpnZXR3ZCgpCmBgYAoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoJ3BseXInLCByZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikKaW5zdGFsbC5wYWNrYWdlcygicGRmdG9vbHMiKQpsaWJyYXJ5KHBkZnRvb2xzKQoKaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInJvcGVuc2NpbGFicy9xY29kZXIiKQoKbGlicmFyeShxY29kZXIpCmBgYApJbnN0YWxsIGFsbCBvZiB0aGUgcGFja2FnZXMgbmVlZGVkIGZvciB0aGlzIHByb29mIG9mIGNvbmNlcHQuIFRoZSBwZGZ0b29scyBwYWNrYWdlcyBhbGxvd3MgdXNlcnMgdG8gY29udmVydCBwZGZzIHRvIHRleHQgZmlsZXMuIFRoZSBkZXZ0b29scyBwYWNrYWdlIG1ha2VzIHBhY2thZ2UgZGV2ZWxvcG1lbnQgZWFzaWVyIGFzIGl0IHByb3ZpZGVzIFIgZnVuY3Rpb25zIHRoYXQgc2ltcGxpZnkgY29tbW9uIHRhc2tzLiBUaGUgbGFzdCB0d28gbGluZXMgb2YgdGhlIHNjcmlwdCBpbnN0YWxscyB0aGUgdGV4dHVhbCBhbmFseXNpcyBwYWNrYWdlICdxY29kZXInLgoKYGBge3J9CmZpbGUubmFtZXMgPC0gZGlyKHBhdGg9InBkZnMiLCBwYXR0ZXJuID0iLnBkZiIsIGZ1bGwubmFtZXM9VFJVRSkKYGBgClRoaXMgY3JlYXRlcyBhIHZhcmlhYmxlIGNhbGxlZCBmaWxlLm5hbWVzIHRoYXQgYnVpbGRzIGEgcGF0aCB0byB0aGUgcGRmcyB0aGF0IG5lZWQgdG8gYmUgY29udmVydGVkIGludG8gdHh0IGZpbGVzLiAnUGF0aD0nIGlzIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgYW5kICdwYXR0ZXJuPScgaXMgdGhlIHBhdHRlcm4gb2YgdGhlIGZpbGVzIC0gaW4gdGhpcyBjYXNlIHRoZSBmaWxlcyBhbGwgZW5kIGluICIucGRmIi4gSWYgZnVsbC5uYW1lcz1UUlVFLCB0aGUgZGlyZWN0b3J5IHBhdGggaXMgcHJlcGVuZGVkIHRvIHRoZSBmaWxlIG5hbWVzIHRvIGdpdmUgYSByZWxhdGl2ZSBmaWxlIHBhdGgsIGlmIEZBTFNFLCB0aGUgZmlsZSBuYW1lcyBhcmUgcmV0dXJuZWQuIAoKYGBge3J9CmZvciAoZmlsZSBpbiBmaWxlLm5hbWVzKSB7CiAgdGV4dCA8LSBwZGZfdGV4dChmaWxlKQoKICAKICBvdXRwdXQuZmlsZSA8LSBnc3ViKCJwZGYiLCAidHh0IixmaWxlKQogIHByaW50KG91dHB1dC5maWxlKQogIHByaW50KGZpbGUpCiAgd3JpdGUodGV4dCwgb3V0cHV0LmZpbGUpCn0KYGBgCkZvciBsb29wcyBhcmUgdXNlZCB0byByZXBlYXQgYSBzcGVjaWZpYyBibG9jayBvZiBjb2RlLiBJbiB0aGlzIGZvciBsb29wLCB3ZSBhcmUgcmVwZWF0aW5nIHRoZSBzZXF1ZW5jZSBvZiB0ZXh0IDwtIHBkZl90eHQoZmlsZSkgZm9yIGVhY2ggZmlsZSB3aXRoaW4gZmlsZS5uYW1lcyAodGhhdCBpcywgd2l0aGluIHRoZSBwZGZzIGRpcmVjdG9yeSkuCgpUaGUgZ3N1YiBmdW5jdGlvbiBmaW5kcyBhbGwgbWF0Y2hlcyBvZiBhIHN0cmluZyBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgbmV3IHN0cmluZy4gVGhhdCBpcywgaW4gZmlsZSBhbGwgb2NjdXJyZW5jZXMgb2YgInBkZiIgd2lsbCBiZSByZXBsYWNlZCB3aXRoICJ0eHQiIC0gdGhpcyB3aWxsIGNyZWF0ZSBhIHZhcmlhYmxlIGNhbGxlZCBvdXRwdXQuZmlsZXMuIAoKVGhlIHByaW50KCkgZnVuY3Rpb24gaXMgYW4gYXJndW1lbnQgdGhhdCBwcmludHMgdGhlIHN0cmluZyBvbiB0aGUgY29uc29sZSAKClRoZSB3cml0ZSgpIGZ1bmN0aW9uIHdyaXRlcyB0aGUgZGF0YSB0byBhIGZpbGUuIFRoYXQgaXMsICd0ZXh0JyBpcyB0aGUgZGF0YSB0byBiZSB3cml0dGVuIG91dCBhbmQgJ291dHB1dC5maWxlJyBpcyB0aGUgc3RyaW5nIG5hbWluZyB0aGUgZmlsZSB0byB3cml0ZSB0byAoaW4gdGhpcyBjYXNlLCAidHh0IikKCmBgYHtyfQojY3JlYXRlX3Fjb2Rlcl9wcm9qZWN0KCJxY29kZXItYW5hbHlzaXMtcHJvamVjdCIpCgppbXBvcnRfcHJvamVjdF9kYXRhKHByb2plY3QgPSAicWNvZGVyLWFuYWx5c2lzLXByb2plY3QiKQoKYGBgClRoZSAnY3JlYXRlJyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gdXNlcnMgd2FudCB0byBjcmVhdGUgYW4gZW1wdHkgcWNvZGVyIGFuYWx5c2lzLiBUaGUgJ2ltcG9ydCcgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHVzZXJzIHdoZW4gdG8gb3BlbiBhbiBleGlzdGluZyBhbmFseXNpcy4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIFBvQyBvbmx5IHRoZSAnaW1wb3J0JyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuCgonUHJvamVjdD0nIGlzIHRoZSBuYW1lIG9mIHRoZSBxY29kZXIgYW5hbHlzaXMuCgpgYGB7cn0KcHJvamVjdF9uYW1lID0gInFjb2Rlci1hbmFseXNpcy1wcm9qZWN0IgpmaWxlX25hbWUgPC0gIkZhYmlhbl8yMDE4LnR4dCIKZG9jc19kZl9wYXRoIDwtInFjb2Rlci1hbmFseXNpcy1wcm9qZWN0L2RhdGFfZnJhbWVzL3Fjb2Rlcl9kb2N1bWVudHNfcWNvZGVyLWFuYWx5c2lzLXByb2plY3QucmRzIgpjb2Rlc19kZl9wYXRoIDwtICJxY29kZXItYW5hbHlzaXMtcHJvamVjdC9kYXRhX2ZyYW1lcy9xY29kZXJfY29kZXNfcWNvZGVyLWFuYWx5c2lzLXByb2plY3QucmRzIgpmaWxlX3BhdGggPC0gInFjb2Rlci1hbmFseXNpcy1wcm9qZWN0L2RvY3VtZW50cyIKZGlyKCJxY29kZXItYW5hbHlzaXMtcHJvamVjdC9kb2N1bWVudHMiKQpgYGAKZmlsZV9uYW1lIGJ1aWxkcyBhIHBhdGggdG8gdGhlIGRhdGEgCmRvY3NfZGZfcGF0aCBidWlsZHMgYSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdGhhdCBob2xkcyB0aGUgZGF0YSAKY29kZXNfZGZfcGF0aCBidWlsZHMgYSBwYXRoIHRvIHRoZSBjb2RlcyAKZmlsZV9wYXRoIGJ1aWxkcyBhIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBob2xkaW5nIHRoZSBmaWxlcyAKCmBgYHtyfQpyYXdQYXRoIDwtICJ+L0Rlc2t0b3AvU29waGllLUF2YXJkLVByb29mLW9mLUNvbmNlcHQvcHJvb2Ytb2YtY29uY2VwdC90eHRzIgpkYXRhZmlsZXMgPC0gZGlyKHJhd1BhdGgsICIqLnR4dCIsIGlnbm9yZS5jYXNlID0gVFJVRSwgYWxsLmZpbGVzID0gVFJVRSkKCmZpbGUuY29weShmaWxlLnBhdGgocmF3UGF0aCwgZGF0YWZpbGVzKSwgZmlsZV9wYXRoLCBvdmVyd3JpdGUgPSBUUlVFKQpgYGAKcmF3UGF0aCBidWlsZHMgYSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgdHh0IGZpbGVzIC0gbWFrZSBzdXJlIHlvdSBjaGFuZ2UgdGhpcyB0byB0aGUgcGF0aCBvZiB0aGUgJ3Byb29mLW9mLWNvbmNlcHQnIGZvbGRlciAobG9jYXRlZCBvbiB5b3VyIERlc2t0b3ApCmRhdGFmaWxlcyBidWlsZHMgYSBwYXRoIHRvIHRoZSBmaWxlcyBjb250YWluaW5nICIudHh0IiB3aXRoaW4gdGhlIHJhd1BhdGgKaWdub3JlLmNhc2UgPSBUUlVFIGNvbnN0cnVjdHMgYSBjYXNlIGluc2Vuc2l0aXZlIHBhdHRlcm4gCgpUaGUgJ2ZpbGUuY29weScgZnVuY3Rpb24gY3JlYXRlcyBhIGNvcHkgb2Ygb2YgdGhlIGRhdGFmaWxlcyB3aXRoaW4gdGhlIHJhd1BhdGggYW5kIHBsYWNlcyB0aGVtIHdpdGhpbiB0aGUgZmlsZV9wYXRoICgicWNvZGVyLWFuYWx5c2lzLXByb2plY3QvZG9jdW1lbnRzIikuIAoKYGBge3J9Cm5ld19kYXRhZnJhbWUgPC0gcmVhZFJEUyhkb2NzX2RmX3BhdGgpCmBgYApUaGlzIHByb3ZlcyB0aGF0IHRoZSBkYXRhIGlzICdpbicgdGhlIHN5c3RlbSBhcyBpdCB3cml0ZXMgYSBzaW5nbGUgUiBvYmplY3QgKGRvY3NfZGZfcGF0aCkgdG8gYSBmaWxlLCBhbmQgcmVzdG9yZXMgdGhlIG9iamVjdCBhcyBuZXdfZGF0YWZyYW1lLgoKYGBge3J9CnJlYWRfY29kZV9kYXRhKHByb2plY3RfbmFtZSA9IHByb2plY3RfbmFtZSkKYGBgClRoaXMgcmVhZHMgdGhlIGNzdiBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGVzIHdpdGhpbiB0aGUgcHJvamVjdAoKYGBge3J9CmNvZGVzX2RhdGFmcmFtZSA8LSByZWFkUkRTKGNvZGVzX2RmX3BhdGgpCmBgYApUaGlzIGxvYWRzIHRoZSBjb2RlcyBpbnRvIFIKCmBgYHtyfQpxY29kZSh1c2Vfd2Q9VFJVRSkKYGBgClRoaXMgY29ubmVjdHMgdGhlIFNoaW55IGFwcCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIHRoZW4gb3BlbnMgaXQuIAo=