I was inspired by the discussion here(http://groups.google.com/group/
sage-devel/browse_thread/thread/e134f0b9292bc65c/49606b41906469d5?
lnk=gst&q=Javascript+spreadsheet+in+Sage+worksheet#49606b41906469d5)
and an assignment I give regularly which requires checking the
numerical results my students generate for data sets after doing some
messy algebra (potentially different each time).
Here is a first pass at a function that generates an interact into
which you can enter columns of data and have them used as the input
into an expression to calculate numerical results. This should
probably be converted to a special version of an interact, but as
proof of principle this is a start. Any comments?
Jonathan
-----------------
def calctable(exprID,nrows):
"""
This function creates an interactive table (mini spreadsheet) with
columns into
which you can enter multiple values for each of the variables in the
function with
the name exprID (pass as a string). A table is then created with the
values for
the variables plus the calculated value of the function in the last
column.
exprID: the string name of the expression (eg. V in case of V=n*R*T/
p)
nrows: # of rows, different values, to enter for calculations.
"""
expr = eval(exprID)
html('$'+exprID+'='+latex(expr)+'$')
all_columns = []
for i in range (0,len(expr.args())):
all_columns.append(expr.args()[i])
all_columns.append(exprID)
ncol = len(all_columns)
inputcol = ncol-1
lastvarcol = ncol-2
td_label = ''
for i in range (0,inputcol):
td_label = td_label+'<td width=141; style=\'text-align:right;
\'>'+str(all_columns[i])+' </td>'
from time import time
uniqueID = str(int(round(time())))
initdata =[]
for i in range(0,nrows):
initdata.append([0]*inputcol)
argstr ='names=text_control(value="<table><tbody><tr>'+td_label+'</
tr></tbody></table>")'
argstr = argstr+',data=input_grid('+str(nrows)+','+str(inputcol)
+', label="", width = 10, default = initdata)'
argstr = argstr+',calc=checkbox(label="Check to calculate '+exprID
+'", default=False) '
functionname = 'calctable'+uniqueID
functionstr = 'def '+functionname+'('+argstr+'):\n'
functionstr = functionstr+'\tall_columns='+str(all_columns)+'\n'
functionstr = functionstr+'\tresults = [0]*'+str(nrows)+'\n'
functionstr = functionstr+'\tif calc:\n'
for k in range (0,nrows):
callstr='results['+str(k)+']='+exprID+'('
for i in range(0,lastvarcol):
callstr=callstr+str(all_columns[i])+'=data['+str(k)+']
['+str(i)+'],'
callstr = callstr+str(all_columns[lastvarcol])+'=data['+str(k)
+']['+str(lastvarcol)+'])'
functionstr = functionstr +'\t\t'+ callstr + '\n'
exprstr = str(exprID)+'='+str(expr)
functionstr = functionstr+'\t\thtml(\"<span>'+exprstr+'</span>\")
\n'
functionstr = functionstr+'\t\thtml(\'<table style=\"border-
collapse:collapse;\"><tbody >\')\n'
functionstr = functionstr+'\t\thtml(\'<tr style=
\"background:yellow; text-align:center;\">\')\n'
functionstr = functionstr+'\t\tfor k in range (0,'+str(ncol)+'):
\n'
functionstr = functionstr+'\t\t\thtml(\'<td style=\"border-
style:solid; border-width:1px; border-color:lightgrey;border-
collapse:collapse;\">\'+str(all_columns[k])+\'</td>\')\n'
functionstr = functionstr+'\t\thtml(\'</tr>\')\n'
functionstr = functionstr+'\t\tfor i in range (0,'+str(nrows)+'):
\n'
functionstr = functionstr+'\t\t\tif (i%2 ==0):\n'
functionstr = functionstr+'\t\t\t\thtml(\'<tr>\')\n'
functionstr = functionstr+'\t\t\tif (i%2!=0):\n'
functionstr = functionstr+'\t\t\t\thtml(\'<tr style=
\"background:lightcyan\">\')\n'
functionstr = functionstr+'\t\t\tfor k in range (0,'+str(inputcol)
+'):\n'
functionstr = functionstr+'\t\t\t\thtml(\'<td style=\"border-
style:solid; border-width:1px; border-color:lightgrey;border-
collapse:collapse;\">\'+str(data[i][k])+\'</td>\')\n'
functionstr = functionstr+'\t\t\thtml(\'<td style=\"border-
style:solid; border-width:1px; border-color:lightgrey;border-
collapse:collapse;\">\'+str(results[i])+\'</td>\')\n'
functionstr = functionstr+'\t\t\thtml(\'</tr>\')\n'
functionstr = functionstr+'\t\thtml(\'</tbody><table>\')\n'
# print functionstr
exec(functionstr)
eval('interact('+functionname+')')
---------
Example usage
>var('n R T p')
>V = n*R*T/p
>calctable('V',4)
--
To post to this group, send an email to [email protected]
To unsubscribe from this group, send an email to
[email protected]
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org