Recently a short idea on how function closures can be build in R is shown [link]. It is also discussed in detail by Darren Wilkinson's blog [link]. Here we will mimic the approach presented there. Recall that function
closures are basically a reference to a function with the attachment of
its lexical environment. Note that, it is not a function pointer
while it also return the values of its arguments if they are defined in
the given scope. This sort of language construction can be very handy
when some of the inner details need to be parametrized, so to speak to
prevent re-writing the function over and over again.
A trivial example of adding a number to a given number can be formulated. Let's say x is a number and we need to add 4 to x.
function add4(x)
x+4
end
So
far so good, but do you really want to re-write an other function to
add 7. Not really! So instead we can generate a function that generates
addition function for 7 (Sounds like an onion.). This is quite standard
in functional languages and noting new actually!
>> addx = @(x) @(y) x + y ;
>> add4=addx(4);
>> add7=addx(7);
>> add4(5)
9
>> add7(5)
12
So function add4 and add7 are generated by the function addx. We just utilized function handles.
This might be quite trivial. Let's try the technique in a little more
realistic setting. Imagine we need to take a median of each vector,
which has different sizes stored in a structure. Let's generate one
>> rng(0.42,'v4'); % reproduce numbers
>> myStr.vec1 = rand(11,1);
>> myStr.vec2 = rand(5,1);
>> myStr.vec3 = rand(20,1);
>> myStr.vec4 = rand(8,1);
So a function that takes a structure like this and returns the median value of the named member
>> medianVec= @(str, memName) median(str.(memName));
For example for vec1
>> medianVec(myStr, 'vec1');
0.5194
If we need this procedure for vec1 repetitively, we don't need to re-write the second argument all the time. So
>> medianVecN = @(memName) @(str) median(str.(memName));
>> medianVec1 = medianVecN('vec1');
>> medianVec1(myStr); % Vala!
0.5194
This might still look trivial but hopefully it would give you an idea of the technique.
Showing posts with label scripting. Show all posts
Showing posts with label scripting. Show all posts
Monday, 3 December 2012
Wednesday, 10 October 2012
Matlab/Octave: imagesc with variable colorbar
Plotting a discrete matrix with a colour map is a common task that one would need in many different fields of sciences. To plot a discrete matrix with MATLAB, a possibility is to use imagesc, while it handles discrete points better then other density utilities, where it can handle (0,0) placement better. However, if there are limited number of values in the matrix entries, you may want to keep only existing ones on the color labels. One way to achieve this is to re-write your 'colormap' via 'jet', that maps existing colours on the current matrix. However, this is not sufficient, you need to re-write your matrix as well. See example code below. So called a variable 'colormap' situation is handled with this approach. (This is tested with MATLAB, on Octave, I think one needs to be careful on 'colormap', values behaviour of 'jet' is little different.)% bare minimum - example -
clear all
close all
allLevelNames = {'one', 'two', 'three', 'four'};
levelValues = [1 2 3 4];
myMatrix = [3 3 3 3; 3 3 3 3; 4 4 1 1; 4 4 1 1];
% Now re-write colormap
aV = length(levelValues);
jj = jet(aV);
availableValues = unique(myMatrix);
getIndexes = arrayfun(@(xx) find(levelValues == xx), availableValues);
colormap(jj(getIndexes,:));
% Re-write myMatrix in the availableValues range
myMatrix = arrayfun(@(x) find(availableValues == x), myMatrix);
% Now Plot
h = imagesc(myMatrix);
% Handle if there is more then one color is in use
maxV = max(availableValues);
minV = min(availableValues);
if(length(availableValues) > 1) caxis([minV maxV]); end;
hcb=colorbar;
set(hcb, 'YTick', availableValues);
set(hcb, 'YTickLabel', allLevelNames(getIndexes));
set(gca,'YDir','normal') % Not to invert x-y but putting (0,0) on the bottom left
xlabel('x values');
ylabel('y values (care on (0,0) location from imagesc)');
title({['Variable colormap handling'];['by msuzen at gmail']});
Thursday, 22 March 2012
Check URL existance with R
RCurl package provides utilities for HTTP and FTP connection. One particular functionality is checking if a given URL is accessible, implying existence, using url.exists. However some unfortunate Windows users may have difficulty to get its latest build from CRAN. Here is a simple function to check existence of URL by only using R base functionality;
urlExists <- function(address) {
tryCatch {
con <- url(address)
a <- capture.output(suppressWarnings(readLines(con)))
close(con)
TRUE;
},
error = function(err) {
occur <- grep("cannot open the connection", capture.output(err));
if(length(occur) > 0) FALSE;
}
)
}
Labels:
GNU R,
network programming,
R programming,
scripting,
web
Saturday, 14 May 2011
Operating in Multiple Repository within ant
Ant script can not change its base directory after it is invoked, for that reason if you are handling two repositories under same directory it would be wise to write a secondary wrapper script.
Saturday, 9 April 2011
R-plugin for vim
vim is a powerful text editor and R is a powerful environment for statistical computing task. To harness both powers a plug-in for vim is developed. One needs python enabled vim and conqueterm.
Labels:
configuration,
editors,
GNU R,
R programming,
scripting
Thursday, 14 August 2008
TCL Bad Code Error
Using tcl extension would be quite reasonable to write a flexable code. How ever if you use parse command set and TCL_OK as a return, be sure that type of your function is int, otherwise tcl complains with a strange run time error, saying bad code. So, be sure about the correct return type.
Subscribe to:
Posts (Atom)
