I am attempting to change the labels in the handy facet plot available in R with ggplot using a function that I created, facet_labeller:
#This function will map a new name to the category labels
facet_labeller <- function(var, value){
value <- as.character(value)
# Creates labels with superscript for 1st and 2nd solvation shells
label_primary <- expression(1^{st} ~ Shell)
label_secondary <- expression(2^{nd} ~ Shell)
if (var=="solvent") {
value[value=="meoh"] <- "Methanol"
value[value=="water"] <- "Water"
}
if (var=="shell") {
value[value=="secondary"] <- label_secondary
value[value=="primary"] <- label_primary
}
if (var=="ion") {
value[value=="Cl"] <- "Cl"
value[value=="Na"] <- "Na"
}
return(value)
}
When the function is called by facet_grid:
facet_grid(shell + ion ~ solvent, scales="free_y", labeller=facet_labeller)
I get the error "Error in value == "primary" : comparison is not allowed for expressions"
I do not understand at all why this is occurring. Changing the line cited by the error will fix things and allow the plot to be created; for example, I can simply comment that line out, or I can put a string instead of the 'label_primary' variable. I need to use the expression, however, because of the superscripts.
Why is this happening? Why doesn't it happen with just one check in that if block? How can I get this to work? Any help would be greatly appreciated - I am at a total loss.
The cause of the error:
At the beginning of the function call, the elements of
value
all have class"character"
. But when you hita bunch of those elements get replaced by expressions. So when you then try to do
R is trying to compare some expressions to strings, but it doesn't know how to do comparison with expressions, so it just complains and stops working.
how to fix it:
Try replacing the block:
with:
This just checks each element once, before anything has been changed, so it avoids trying to do comparisons with expressions.