5
$\begingroup$

I would like to be able to use ResourceFunction's as top-level symbols:

enter image description here

The reason being that some of them are so useful it would be really great not to have to type out ResourceFunction["FunctionName..."] each time.

Is there some way to load them all into System context once? For a bonus: add documentation locally.

The first issue is that I don't know how to find them all:

l

$\endgroup$
2
$\begingroup$

I'll post how I did it by scraping, but it's not a great solution:

html = Import[
   "https://resources.wolframcloud.com/FunctionRepository/all/", 
   "String"];
names = StringCases[html, 
   "<h3>" ~~ Whitespace ~~ "<a " ~~ Shortest[__] ~~ ">" ~~ 
     x : Shortest[__] ~~ "</a>" :> x];
With[{u = ToExpression[#]}, u := ResourceFunction[#]] & /@ names

Then we have all of them

enter image description here

In the system context

enter image description here

Then they load on demand, but trying to load all at once takes 16 minutes:

enter image description here

I haven't found a way to cache them and or to load the docs locally yet...

$\endgroup$
2
+25
$\begingroup$

I dug and found where the names for the autocomplete are cached:

<<ResourceSystemClient`;
names = ResourceSystemClient`Private`publicResourceInformation["Names"]["Function"];

If that doesn't work do this:

names =
  ResourceSearch[{"ResourceType" -> "Function", "Name" -> "*"}, MaxItems -> 1000][[All, "Name"]] // Normal;

Now you can do something like:

ToExpression[
 "System`" <> # & /@ names, 
 StandardForm,
 Function[
  Null,
  With[{sn = SymbolName[Unevaluated[#]]},
   SetDelayed[#, # = ResourceFunction[sn]]
   ],
  HoldAllComplete
  ]
 ]

And all the resource functions are dynamically loaded into the "System`" context

$\endgroup$
  • $\begingroup$ Looks like names has only 62 of the 447... $\endgroup$ – M.R. Apr 28 at 22:28
  • $\begingroup$ And wouldn't With[{u = ToExpression[#]}, u := ResourceFunction[#]] & /@ names be simpler... $\endgroup$ – M.R. Apr 28 at 22:49
  • $\begingroup$ @M.R. with all that I'm making sure a) the symbol doesn't already have an OwnValue and b) that ResourceFunction isn't evaluated multiple times. b) only covers a small bit of overhead, but it's a harmless little efficiency. As for names not having everything, you might need to reload the paclet? I have 485 entries in it. $\endgroup$ – b3m2a1 Apr 29 at 16:26
  • $\begingroup$ That makes sense. But after running PacletUpdate["ResourceSystemClient"] I have Paclet["ResourceSystemClient", "1.12.0", <> ], and it's only showing 69 names... $\endgroup$ – M.R. Apr 29 at 17:45
  • 1
    $\begingroup$ Right, ok so we get this behavior for free it seems. $\endgroup$ – M.R. May 1 at 18:31
1
$\begingroup$

Just do

DynamicMap = ResourceFunction["DynamicMap"]

and now you can use

DynamicMap[# + 1 &, Range[100]]

as expected.

$\endgroup$
  • $\begingroup$ Right, but see the updates... how to do for all programmatically? That's the tricky part. $\endgroup$ – M.R. Apr 23 at 17:22
  • $\begingroup$ that is the first thing I thought of, but there might be a bug in ResourceSearch... $\endgroup$ – M.R. Apr 23 at 17:44
  • $\begingroup$ Ah, my apologies, I didn't see your edit before answering. $\endgroup$ – Carl Lange Apr 23 at 17:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.