R语言中使用assign函数时如何将函数输出保存到对象
datasetperuniversity Function Hey there! The issue with your current function is that it uses assign() to create a variable directly in your global environment, which means it doesn't return a value you can explicitly save to an object. Let's fix that while keeping your DRY principle goal intact, and align with better R coding practices.
The Cleaner Approach: Return the Filtered Dataset Directly
Instead of relying on assign() to spawn global variables, rewrite the function to return the subset as its output. This makes the function's purpose crystal clear, avoids cluttering your environment accidentally, and lets you save the result to any object you want.
Here's the revised function:
datasetperuniversity <- function(university, year){ # Build names for the original data and collaboration column original_data_name <- paste("originaldata", year, sep = "") collab_column_name <- paste("allcollaboration", university, sep = "") # Fetch the original dataset and apply the filter filtered_data <- subset(get(original_data_name), get(collab_column_name) == 1) # Return the filtered result filtered_data }
How to Use It
Now you can directly assign the function's output to an object, just like any standard R function:
# Save Harvard 2000 data to dataHarvard dataHarvard <- datasetperuniversity("Harvard", "2000") # Or save it to a custom-named object if you prefer harvard_2000_collabs <- datasetperuniversity("Harvard", "2000")
Why This Is Better Than Your Original Function
- No hidden side effects: Your original function modifies the global environment without explicit intent. The revised version only returns a value, so you have full control over where it's stored.
- Greater flexibility: You can pass the output directly to other functions (e.g.,
ggplot(datasetperuniversity("Harvard", "2000"), aes(x = ...))) without creating an intermediate variable. - Easier debugging: If something breaks, you can inspect the returned value immediately instead of hunting for a variable created silently by
assign().
If You Really Need to Keep assign() (Not Recommended)
If for specific reasons you still want the function to create a global variable and return the value, you can add a return statement at the end:
datasetperuniversity <- function(university, year){ var_name <- paste("data", university, sep = "") original_data_name <- paste("originaldata", year, sep = "") collab_column_name <- paste("allcollaboration", university, sep = "") assign(var_name, subset(get(original_data_name), get(collab_column_name) == 1)) # Return the created variable for explicit assignment return(get(var_name)) }
But again, the first approach is far cleaner and more idiomatic for R code.
内容的提问来源于stack exchange,提问作者Ger

