2012-01-10 34 views
7

में स्थानीय गतिशील निर्दिष्ट करें मैं विभिन्न तरीकों से Grid गतिशील रूप से विशिष्ट भागों को अपडेट करना चाहता हूं। निम्नलिखित खिलौने उदाहरण पर विचार करें: मेरे पास दो पंक्तियां हैं: एक को एक-एक-एक (, बी, सी) अपडेट किया जाना चाहिए, क्योंकि ये प्रतीक विभिन्न ट्रिगर्स पर निर्भर करते हैं; दूसरी पंक्ति एक एकल ट्रिगर पर निर्भर करती है (शो) जो कुछ डेटा प्रदर्शित/छिपाने की अनुमति देती है। कुछ कारणों के लिएग्रिड

Checkbox[Dynamic[show]] 
test = {0, 0}; 
Dynamic[Grid[{{[email protected], [email protected], [email protected]}, 
    If[show, Prepend[test, "test:"], {}]}, Frame -> All], 
TrackedSymbols :> {show}] 

Mathematica graphics

हालांकि:

अब मुझे पता है कि मैं Dynamic में पूरी Grid संरचना लपेट कर सकते हैं, और यहां तक ​​कि जो प्रतीकों ट्रैक करने के लिए निर्दिष्ट करते हैं, इस प्रकार इस उदाहरण करता है जो मैं चाहता मैं स्थानीय रूप से निर्दिष्ट Dynamic चाहता हूं, जो केवल Grid की दूसरी पंक्ति पर लागू होता है।

जो लोग सोच रहे हैं कि क्या धर्मभ्रष्ट स्थिति यह होगा के लिए, बस निम्नलिखित कल्पना: showa, b या c में से किसी में प्रयोग किया जाता है, और इन मैं नहीं चाहता हूँ अद्यतन करने के लिए जब show बदल रहा है, उनके परिवर्तन पर निर्भर हैं अन्य ट्रिगर्स पहली पंक्ति के प्रतीकों से show को क्यों न हटाएं? कल्पना कीजिए, मैं नहीं कर सकता, showa, b या c में उपयोग किए जाने वाले फ़ंक्शन में मौजूद है, और यह फ़ंक्शन मैं आसानी से नहीं पहुंच सकता।

पाठ्यक्रम Dynamic में If का पहला तर्क लपेटकर यहाँ मदद नहीं करेगा के

, Grid रूप में खुद को या अपने कोशिकाओं के किसी भी गतिशील नहीं हो जाएगा:

Grid[{ 
    {[email protected], [email protected], [email protected]}, 
    If[[email protected], Prepend[test, "test:"], {}] 
    }, Frame -> All] 

इसके अलावा, Dynamic बनाता है में एक पंक्ति लपेटकर भी पंक्ति, अवैध रूप में यह सिर List अब और नहीं है:

Grid[{ 
    {[email protected], [email protected], [email protected]}, 
    [email protected][show, Prepend[test, "test:"], {}] 
    }, Frame -> All] 

मानचित्रण Dynamic पंक्ति पर क्योंकि या तोसे काम नहीं करतागतिशील रूप से अद्यतन किया जाता है नहीं:

Grid[{ 
    {[email protected], [email protected], [email protected]}, 
    Dynamic /@ If[show, Prepend[test, "test:"], {}] 
    }, Frame -> All] 

इसके अलावा, लपेटकर Dynamic[If[...]] सूची सदस्यों के आसपास काम करते हैं, लेकिन अब मैं अगर वहाँ के बजाय If 3 बार सिर्फ 1.

Grid[{ 
    {[email protected], [email protected], [email protected]}, 
    Dynamic[If[show, #, ""]] & /@ Prepend[test, "test:"] 
    }, Frame -> All] 

चाहेंगे मूल्यांकन करने के लिए पता करने के लिए है एक पंक्ति पर Dynamic रैपर को स्थानीय रूप से लागू करके इस विशेष समस्या को दूर करने के लिए कोई समाधान।

+0

तो तुम एक समाधान जहां 1. दो पंक्तियों 2. दोनों पंक्तियों '3. show' लेकिन केवल दूसरी पंक्ति पर निर्भर अद्यतन किया जाना चाहिए जब' शो के साथ एक ग्रिड वहाँ की जरूरत है 'परिवर्तन क्या इसे मैंने ठीक तरह से लिया? – Szabolcs

+0

क्या आप समझा सकते हैं कि 'अगर' अवांछनीय के तीन मूल्यांकन क्यों हैं? क्या 'if' महंगा में परीक्षण है? हम किसी ऐसे समय के साथ आ सकते हैं जो परीक्षण का मूल्यांकन एक ही समय में करता है और परिणाम को एक चर में संग्रहीत करता है जो फिर तीन 'if's को नियंत्रित करता है। मेरा मानना ​​है कि अगर आप पूरी चीज लपेटते हैं तो आप 'ए, बी, सी' को अपडेट करने से नहीं बच सकते हैं, लेकिन मुझे यकीन नहीं है! – Szabolcs

+0

हां, आप आवश्यकताओं के बारे में सही हैं, और नहीं, ज़ाहिर है कि अगर परीक्षण बहुत महंगा नहीं है, और फिलहाल कोड उस तरह चलता है (मैपिंग अगर)। और भी समस्याग्रस्त हालांकि एक और चीज है, जिसे मैं अभी ठीक करने की कोशिश कर रहा हूं। –

उत्तर

3

यहाँ एक समाधान प्रायोगिक ValueFunction

show = True; 
test = {0, 0}; 
Checkbox[Dynamic[show]] 

का उपयोग कर अब पक्ष

Needs["Experimental`"]; 
row = {}; 
updateRow[x_, v_] := row = If[v, Prepend[test, "test:"], {}]; 
ValueFunction[show] = updateRow; 

अब ग्रिड बनाने, और अब प्रत्येक पंक्ति पर गतिशील उपयोग कर सकते हैं पर अपने खुद के छोटे से गतिशील अद्यतन समारोह लिखना है , पूरे ग्रिड के आसपास नहीं, जो आप चाहते थे:

Grid[{ 
    {[email protected], [email protected], [email protected]}, 
    {[email protected]} 
    }, 
Frame -> All 
] 

enter image description here

ps। मैंने यहां telefunkenvf14 द्वारा एक पोस्ट पढ़ी है जो इस पैकेज और इस फ़ंक्शन का उल्लेख करती है, जिसे मैं नहीं जानता था, और जब मैंने यह फ़ंक्शन देखा, तो मुझे यह प्रश्न याद आया, और मैंने सोचा कि इस समस्या को हल करने के लिए उस फ़ंक्शन का उपयोग करना संभव होना चाहिए ।

ps। मैं ग्रिड पंक्ति सही ढंग से रखने के बारे में अधिक काम करने की जरूरत ....

अद्यतन (1)

मैं समझ नहीं सकता कैसे ग्रिड में स्तंभों पर अंतिम पंक्ति ब्याह करने के लिए। जो अजीब है, क्योंकि इसमें सूची प्रमुख है, फिर भी यह सभी कॉलमों में नहीं जायेगा। यह केवल पहले सेल में जाएगा। अनुक्रम अनुक्रम, SpanFromLeft, और ऐसे, लेकिन कोई किस्मत। हो सकता है कि कोई इस भाग को समझ सके।

Needs["Experimental`"]; 
row = {}; 
updateRow[x_, v_] := row = If[v, {"test:", 0, 0}, {}]; 
ValueFunction[show] = updateRow; 
show = False; 
Checkbox[Dynamic[show]] 

f = Grid[{ 
    {[email protected], [email protected], [email protected]}, 
    [email protected][row] 
    }, 
    Frame -> All 
    ] 

ऐसा लगता है यह संभव होना चाहिए:

यहाँ मेरे वर्तमान परीक्षण है। मैं नहीं दिख रहा है अब समस्या क्या है ...

अद्यतन (2)

एक अस्थायी समाधान के रूप में, मैं दूसरी पंक्ति बल द्वारा पहले से अलग हो गए। इससे मुझे जो करना चाहिए वह करना संभव हो गया। सुनिश्चित नहीं हैं कि अगर यह ओपी उनके अनुरूप है या नहीं (मेरा अनुमान है कि यदि ऐसा नहीं होता है), लेकिन यहाँ यह है:

Needs["Experimental`"]; 
ra = 0; 
rb = 0; 
rc = 0; 
updateRow[x_, v_] := 
row = If[v, ra = "test:"; rb = 0; rc = 0, ra = ""; rb = ""; rc = ""] 
ValueFunction[show] = updateRow; 
show = False; 
Checkbox[Dynamic[show]] 

f = Grid[{ 
    {[email protected], [email protected], [email protected]}, 
    {[email protected], [email protected], [email protected]} 
    }, 
    Frame -> All] 

enter image description here

+2

दस्तावेजों के अंधेरे रिक्त स्थानों को टोल करने वाले घंटों को देखने के लिए अच्छा लगा है। उल्लेख के लिए धन्यवाद। : डी – telefunkenvf14

+0

नासर: बिल्कुल वही नहीं जो मैं खोज रहा था, लेकिन यह उन सभी दृष्टिकोणों में अच्छी तरह से जोड़ता है जिन्हें मैंने अभी तक कोशिश की है। समस्या मूल रूप से एक ग्रिड में एक पंक्ति को अद्यतन करने के लिए है, जैसे कि पंक्ति की सामग्री विभाजित नहीं होती है, अलग, अलग, विच्छेदन, आदि –

1

यह वास्तव @ नासिर के समाधान पर एक टिप्पणी है और करने के लिए ठीक सुझाव दिया दूसरी पंक्ति के मैन्युअल विभाजन से बचें, लेकिन टिप्पणी क्षेत्र में अंतरिक्ष सीमाओं के कारण, मैं इसे उत्तर के रूप में पोस्ट करता हूं। जैसे ही नासर ने पुष्टि की कि यह काम करता है और इसे अपने उत्तर में शामिल करता है, इसे हटाने में खुशी होगी।

एक समाधान करने के लिए सुराग दस्तावेज में Item की Possible Issues अनुभाग में पाया जाता है:

हैं आइटम एक समारोह मद का समर्थन करता है कि बच्चे में सर्वोच्च आइटम नहीं है, यह काम नहीं करेगा ।

मैं निम्नलिखित तरीके से @ नासर के समाधान को संशोधित करने के लिए इसका उपयोग करता हूं। सबसे पहले, मुझे row की परिभाषा को बदलने की आवश्यकता है ताकि show दोनों मानों के लिए row की लंबाई समान हो।

Needs["Experimental`"]; 
row = {"", "", ""}; 
updateRow[x_, v_] := row = If[v, Prepend[test, "test:"], {"", "", ""}]; 
Experimental`ValueFunction[show] = updateRow; 

दूसरा बदलाव की जरूरत Item साथ [email protected] के प्रत्येक तत्व रैप करने के लिए है:

Grid[{{[email protected], [email protected], [email protected]}, 
{Item[[email protected][[1]]], Item[[email protected][[2]]], 
Item[[email protected][[3]]]}}, Frame -> All] 

संपादित करें: Item आवरण वास्तव में जरूरत नहीं है; इसके बिना बस के रूप में अच्छी तरह से काम करता है:

Grid[{{[email protected], [email protected], [email protected]}, 
{[email protected][[1]], [email protected][[2]], 
[email protected][[3]]}}, Frame -> All] 
+0

ठीक है, मैं कहूंगा कि दूसरी पंक्ति मैन्युअल रूप से विभाजित है। मुझे लगता है कि अब मुझे आश्वस्त है कि पूरे ग्रिड संरचना के चारों ओर गतिशील लपेटने के अलावा इस समस्या का कोई आसान और स्पष्ट समाधान नहीं है - या ग्रिड को दो ग्रिड में विभाजित करें और केवल दूसरा अपडेट करें। –

+0

@ इस्तवान, मैं सहमत हूं। IMHO अपने पहले और अंतिम समाधान सबसे साफ है। – kglr