Re: Copy and Pasting Tables into Spreadsheet
- To: mathgroup at smc.vnet.net
- Subject: [mg83504] Re: Copy and Pasting Tables into Spreadsheet
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Wed, 21 Nov 2007 05:57:40 -0500 (EST)
- References: <fhp2jd$1q6$1@smc.vnet.net> <fhu71j$70l$1@smc.vnet.net> <4742DFB0.20107@gmail.com> <fi0nnh$5gb$1@smc.vnet.net>
Gregory Lypny wrote:
>
> On 20-Nov-2007, at 8:22 AM, Jean-Marc Gulliet wrote:
>
>> gregory.lypny at videotron.ca wrote:
>>
>> <snip>
>>
>>> Is there a way to tell
>>> Mathematica to return a scalar in all situations when the result
>>> would
>>> otherwise be a list with only one element?
>> Gregory,
>>
>> You could use the system variable *$Post* and set up your own post
>> processing function. (You might be interested in $PrePrint too.)
>> Here is an example of such a function that should do what you are
>> looking for, though you may want to add some additional tests (or
>> remove few of them).
>>
>> In[1]:= $Post =
>> If[Head[#] === List && Length[#] == 1 &&
>> Depth[#] < 3, #[[1]], #] &;
>>
>> prob = {.4, {.6}, {.4, .6}, {{.4, .6}}};
>>
>> prob[[1]] (* Scalar: not a list, depth one *)
>> prob[[2]] (* List of length one and depth two *)
>> prob[[3]] (* List of length two and depth two *)
>> prob[[4]] (* List of length one and depth three *)
>>
>> $Post =. (* Reset $Post *)
>>
>> Out[3]= 0.4
>>
>> Out[4]= 0.6
>>
>> Out[5]= {0.4, 0.6}
>>
>> Out[6]= {{0.4, 0.6}}
>>
>
> Thank you Jean-Marc,
>
> I'll look into this. I'm also tinkering with a brute-force script
> that will flatten and then partition any table to create one with a
> depth of 3. That should allow copying of numbers as plain text and
> then pasting them into other applications.
>
[note: swapped the quoted posts to keep chronological order]
Map[Flatten, data, {1}] will flatten out everything in 'data' above
level 1.
The problem with *returning* a scalar in all cases when the result would
be a single-element list is that return values cannot be precisely
defined in Mathematica (because of how evaluation works). The things
"returned" by a function might be evaluated further.
The problem with the $Post approach is that it only works on the final
result of an evaluation. With the suggested $Post function, {2*3}
evaluates to 6, but Table[{i j}, {i, 8}, {j, 8}] still evaluates to a
{8, 8, 1} list. It is a bit dangerous to use $Post in this way because
it may deceive you (by altering results) and lead to more confusion. If
List weren't Locked, one could do List[{x_}] := x, but this would break
lots and lots of things ...
Szabolcs