1) Yes, there is a function called selectInput() that will allow you to do just that - select a file from somewhere else on the user's computer. If you want to add that file to the data directory, you can use selectInput() to have them find the file they want, then simply load (with either loadStrings() or loadBytes()) it and save it in the data directory (saveStrings or saveBytes()).
2) Yes, you can load files anywhere you like! We usually suggest that loading happens in setup() because that way we can be assured that the same file isn't being loaded over and over again (because setup() only runs once. You are certainly welcome to have a boolean that tracks if a file has been loaded, and make loading it conditional on that boolean.
Any questions?