Conditional images can be conditioned on a single value, R output, table, or variable. The examples below are conditioned on an R output that is linked to a combo box, allowing you to change the image in realtime.
Conditional images can either use images provided by Displayr or link to custom images stored online.
Displayr provides a variety of inbuilt pictures and icons that can be used in conditional images. The example below shows how conditional images can be used to present satisfaction data.
Any image can be included in a conditional image as long as it has a URL. The example below shows how logos and icons can be altered depending on the input.
var allow_control_groups = Q.fileFormatVersion() > 10.9;
var font_list = !!Q.GetAvailableFontNames ? Q.GetAvailableFontNames() : ["Arial", "Arial Black", "Century Gothic", "Comic Sans MS", "Courier New", "Georgia", "Impact", "Open Sans", "Tahoma", "Times New Roman", "Trebuchet MS", "Verdana"];
var default_font_color = "#2C2C2C";
if (allow_control_groups);
form.group("DATA SOURCE");
var datOpt = form.comboBox({name: "formDataSource", label: "Data source", alternatives: ["Type or paste value", "Use an existing R output", "Table", "Variable - Average", "Variable - Sum", "Variable - Percentage", "Variable - Most frequent"], default_value: "Type or paste value"}).getValue();
var showPercent = false;
if (datOpt == "Type or paste value")
form.textBox({name: "formInputText", label: "Input data", prompt: "Enter a numeric or text value", required: true}) // for shapes, this can be text
else if (datOpt == "Use an existing R output")
{
var inputR = form.dropBox({name: "formInputR", label: "Input data", types: ["RItem:integer,numeric,character,factor"], required: true});
if (inputR.getValue() != null)
{
form.textBox({name: "formTableRow", label: "Select Row", prompt: "Enter name or index of row of the entry you want to display. Leave blank to show first entry", required: false});
form.textBox({name: "formTableColumn", label: "Select Column", prompt: "Enter name or index of column of the entry you want to display. Leave blank to show first entry", required: false});
}
}else if (datOpt == "Table")
{
var inputTable = form.dropBox({name: "formInputTable", label: "Input data", types: ["Table", "RItem:matrix,array,data.frame,table"]});
if (inputTable.getValue() != null)
{
form.textBox({name: "formTableRow", label: "Select Row", prompt: "Enter name or index of row of the entry you want to display"});
form.textBox({name: "formTableColumn", label: "Select Column", prompt: "Enter name or index of column of the entry you want to display. Leave blank for 1-d table.", required: false});
}
}
else if (datOpt == "Variable - Percentage")
{
showPercent = true;
var percentVar = form.dropBox({name: "formInputVariable", label: "Input data", types: ["Variable: Numeric, Date/Time, Money, Text, Categorical, OrderedCategorical"]});
if (percentVar.getValue() != null)
form.textBox({name: "formCategory", label: "Category", required: false, prompt: "Enter name of category you want to display percentage of"});
}
else
form.dropBox({name: "formInputVariable", label: "Input data", types: ["Variable: Numeric, Date/Time, Money, Text, Categorical, OrderedCategorical"]});
if (allow_control_groups)
form.page("Format")
if (allow_control_groups);
form.group("IMAGE");
var imageType = form.comboBox({name: "formImageType", label: "Image type", alternatives: ["Displayr images", "Custom images"], default_value: "Displayr images"}).getValue();
var imageList = ["Apple","Baby", "Beer", "Bread","Cake", "Car", "Chicken", "Circle", "Cross", "Elephant", "Face - Happy", "Face - Neutral", "Face - Sad", "Globe", "Gun", "Heart", "House", "Money", "Soldier", "Square", "Star", "Sick person", "Stick man", "Stick woman", "Symbol - Cross", "Symbol - Minus", "Symbol - Plus", "Symbol - Tick", "Thumbs up", "Thumbs down", "Tick", "Truck", "User", "Water drop", "Weight", "Wine"];
if (imageType == "Custom images")
var condImageForm = function(i) { form.textBox({name: "formImageURL" + i, label: i == 0 ? "Default image": "Image " + ci, prompt: i == 0? "URL of image to show if the input value is not equal to or greater than any of the thresholds below " : "URL of image to show if input value is equal to or greater than Threshold " + i}); }
else
var condImageForm = function(i) { form.comboBox({name: "formImage" + i, label: i == 0 ? "Default image" : "Image " + ci, alternatives: imageList, default_value: "Stick man", prompt: i == 0 ? "Image to show if the input value is not equal to or greater than any of the thresholds below" : "Image to show if input value is equal to or greater than Threshold " + i});
form.colorPicker({name: "formColor" + i, label: "Fill color", default_value: "#3E7DCC"});
}
condImageForm(0);
var cond = "";
var ci = 1;
while (ci == 1 || cond != "")
{
cond = form.textBox({name: "formImageThres" + ci, label: "Threshold " + ci, required: false, prompt: "Optional threshold value. If the input value is equal or greater than this threhold, Image " + ci + " will be used."}).getValue();
if (cond != "")
condImageForm(ci);
ci = ci + 1;
}
if (allow_control_groups)
form.group("BACKGROUND")
bgOpt = form.checkBox({name: "formTransparent", label: "Transparent background", default_value: true}).getValue();
if (!bgOpt)
form.colorPicker({name: "formBgColor", label: "Background color", default_value: "#FFFFFF"});
form.numericUpDown({name: "formMarginRight", label: "Right margin", maximum: 1000, default_value: 0});
form.numericUpDown({name: "formMarginLeft", label: "Left margin", maximum: 1000, default_value: 0});
form.numericUpDown({name: "formMarginTop", label: "Top margin", maximum: 1000, default_value: 0});
form.numericUpDown({name: "formMarginBottom", label: "Bottom margin", maximum: 1000, default_value: 0});
library(flipTransformations)
library(flipTables)
library(flipPictographs)
value <- NULL
warnFilterOrWeight <- TRUE
getIndex <- function(index)
{
if (nchar(index) > 0)
return(index)
else
return(1)
}
if (formDataSource == "Type or paste value") {
# ParseUserEnteredTable has extra parsing for '$', ',', '%', etc
value <- ParseText(formInputText)
} else if (formDataSource == "Use an existing R output") {
value <- SelectEntry(formInputR, getIndex(formTableRow), getIndex(formTableColumn), return.single.value = TRUE)
} else if (formDataSource == "Table") {
value <- SelectEntry(formInputTable, formTableRow, formTableColumn, return.single.value = TRUE)
} else {
warnFilterOrWeight <- FALSE
value <- SummarizeVariable(formInputVariable, type = formDataSource, category = get0("formCategory"),
weights = QPopulationWeight, subset = QFilter)
}
if (warnFilterOrWeight && length(QFilter) > 1)
warning("Filters have not been used. They can only be applied to variables.")
if (warnFilterOrWeight && length(QPopulationWeight) > 1)
warning("Weights have not been used. They can only be applied to variables.")
ci <- 1
image <- NA
fill.color <- NA
imagebase <- if (formImageType == "Custom images") "formImageURL" else "formImage"
is.value.ordered <- is.numeric(value) || is.ordered(value) || inherits(value, "Date") || inherits(value, "POSIXct") || inherits(value, "POSIXt")
while (is.na(image))
{
thres.str <- get0(paste0("formImageThres", ci), ifnotfound = "")
thres.val <- ParseText(thres.str, same.as = value)
if (thres.str == "" && ci == 1)
image <- paste0(imagebase, "0")
else if (thres.str == "" && !is.value.ordered)
image <- paste0(imagebase, "0")
else if (thres.str == "")
image <- paste0(imagebase, ci - 1)
else if (is.value.ordered && isTRUE(value < thres.val))
image <- paste0(imagebase, ci - 1)
else if (value == thres.val)
image <- paste0(imagebase, ci)
else
ci <- ci + 1
}
if (formImageType != "Custom images")
fill.color <- get0(gsub(imagebase, "formColor", image))
image <- get0(image)
viz <- VisualizeNumber("",
display = "Icon",
image = image,
is.custom.url = isTRUE(formImageType == "Custom images"),
fill.color = fill.color,
hide.base.image = TRUE,
background.color = get0("formBgColor", ifnotfound = "white"),
background.opacity = if (formTransparent) 0.0 else get0("formBgOpacity", ifnotfound = 1.0),
margin.left = formMarginLeft,
margin.right = formMarginRight,
margin.top = formMarginTop,
margin.bottom = formMarginBottom)