スプレッドシートの背後にあるデータ構造は何ですか?


35

スプレッドシート(​​他のセルを参照する値または数式を含む名前付きまたはその他の方法で識別されたセルのグループ)がどのように解決されるかを理解したいと思います。既存のプロジェクトを調べてみましたが、GUI、シリアル化、イベントなどで非常に多くのことが行われていたため、スプレッドシートが見つかりませんでした。

その最も簡単な方法はどのように機能しますか?


1
最小限のGUI(したがって、問題の本質
page=

回答:


21

基本的に、スプレッドシートは動的型付けを備えた関数型言語であり、各関数または値はマトリックス内のセルとして参照できます。

代わりのようなものの一部はセル自体に配置されます。(defn some-name ...)some-name

動的に更新する関数型言語ide(clojureのlighttableなど)にアクセスすると、スプレッドシートと同じ機能の多くが表示されます。値を名前にバインドし、その値を使用する関数を作成し、値を変更すると、関数の出力がすぐに変更されます。これは、Excelの=A1 + B2場所で書くようなことをするのと同じC3です。

したがって、機能的なプログラマーは、スプレッドシートをおもちゃのプログラムとして書くことを好むことが多く、研究論文の主題でもあります。(はい、すみません、それらはすべてACM.orgペイウォールの背後にあります)

  • スプレッドシートの関数型プログラミング

    関数型プログラミングコミュニティはスプレッドシートにある程度の関心を示していますが、驚くべきことに、Excelなどの標準的なスプレッドシートをHaskellなどの標準的な関数型プログラミング言語で動作させることを検討している人はいません。このホワイトペーパーでは、これを実現する1つの方法を示します。そうすることで、スプレッドシートプログラマーに関数型プログラミングを試してもらうことができます。

  • Forms / 3:スプレッドシートパラダイムの境界を探索するための1次視覚言語

    関数型プログラミングの中傷者は、関数型プログラミングはほとんどのプログラマーにとって理解と使用が難しいか直観に反すると主張することがありますが、スプレッドシートの人気を調べることで反対の証拠を見つけることができます。関数型プログラミングパラダイムの1次サブセットであるスプレッドシートパラダイムは、プログラマーとエンドユーザーの両方に広く受け入れられています。それでも、ほとんどのスプレッドシートシステムには多くの制限があります。このホワイトペーパーでは、1次の宣言的評価モデルから逸脱することなく、これらの制限のいくつかを排除する言語機能について説明します。

  • 関数スプレッドシートの実装

    スプレッドシートを使用して、大量のエンドユーザー開発が行われます。スプレッドシートのメタファーは視覚的でインタラクティブな実験に対応しているため魅力的ですが、Peyton Jones、Blackwell、およびBurnettが観察したように、スプレッドシートのメタファーは最も基本的な抽象化さえも認めません:式を名前付き関数に変換することです。したがって、彼らは、指定された入力および出力セルを持つワークシートに関して関数を定義する方法を提案しました。これを関数シートと呼びます。


ウィキペディアでのスプレッドシートの開始は、それを実装する方法に関するいくつかのヒントを提供します。

スプレッドシートは、表形式のデータを整理および分析するためのインタラクティブなコンピューターアプリケーションプログラムです。紙の会計ワークシートのコンピューター化されたシミュレーションとして開発されたスプレッドシート。このプログラムは、行と列に編成された配列のセルとして表されるデータを操作します。配列の各セルは、数値またはテキストデータ、または他のセルの内容に基づいて値を自動的に計算して表示する数式の結果を含むことができるモデルビューコントローラー要素です。

Javaライブラリで表現されるModel-View-Controllerパラダイムの概要からこれを構築します。作者はさらにアプレットに言及し(少し古く、'93 -'96に書かれていました)、http://csis.pace.edu/~bergin/Java/applets.htmに行く彼のWebページに言及しています(はい、アプレット)対応するスプレッドシートコードhttp://csis.pace.edu/~bergin/Java/Spreadsheet.java

スプレッドシート全体が、ドキュメントを含むこのアプレット570行ではそれほど大きくないことを指摘します。

ただし、言語によっては、おそらくスパース配列の関数ポインターだけですべてを実行できます。


32

概念的には、各セルは有向非巡回グラフのノードであり、他のセルへの参照はそのグラフにエッジを作成します。あなたはセルを変更すると、トポロジカルソートあなたが変わっセルから到達可能なすべてのノードのは、あなたがた細胞を評価する必要がある順序を提供します。正しい順序を決定したら、それは単なる標準式の構文解析です。


3
まあ、私は重要と呼んでいますが、スプレッドシートにサイクルを作成できないという保証はありません。実際、Excelでこれをテストしましたが、警告が表示されましたが、無視することで簡単に循環参照を作成できました。
ドックブラウン

1
@DocBrownループに巻き込まれてプログラムがフリーズするのを避けるために、おそらく最後のリンク(それを引き起こすリンク)で切断されます。
イズカタ

1
良い点、@ DocBrown。再帰を許可する場合でも、計算順序の目的で、サイクルを検出し、DAGのように扱う必要があります。あなたはその注文を何度も繰り返します。
カールビーレフェルト

この種のDAG依存関係をシミュレートするために、どのデータ構造を使用できますか?隣接行列をチェックしていましたが、* n配列では、属性をノードとエッジに関連付けることができませんでした。たとえば、セル上の式は属性の1つになります
アンディデュフレーネ

6

既に述べたように、スプレッドシートは、単純なハッシュまたは辞書に保存されたDAG(有向非巡回グラフ)として簡単に実装できます。プレイするためのいくつかの簡単なコードは、おそらくそれを理解する最も簡単な方法です。

非常に単純なPythonバージョン:http : //code.activestate.com/recipes/355045-spreadsheet/

これは、このブログ投稿で説明され、詳しく説明されています:http : //ralsina.me/weblog/posts/BB585.html

GUIを備えたシンプルなJavaScriptバージョンもここにあります:http : //jsfiddle.net/ondras/hYfN3/


0

MS Excelファイルの目的関数セル構造をPythonに変換できるPythonパッケージをコーディングしました。XL2py

セル値はdict()型オブジェクトに解析され、値が追加されます。数式によって他のセルを参照するセルはノードを構成します。ノードは、式によって値が定義されるセルを参照します。各ノード式から、循環参照が存在するかどうかを定義するために、依存構造が定義されます。ノードの計算順序は、関連するセルの依存構造を考慮して定義されます。

I / Oツリー構造の時点では、Pythonに実装されている最小化アルゴリズムを自由に使用できます。

https://github.com/gusmaogabriels/XL2pyをご覧になることをお勧めします

よろしく、ガブリエル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.