চকচকে ইভেন্টআরেক্টিভ হ্যান্ডলারের মধ্যে কীভাবে একাধিক ইভেন্টের এক্সপ্রেশন শোনা যায়


88

আমার অ্যাপে বিভিন্ন প্লট / আউটপুট দ্বারা ব্যবহৃত ডেটার একটি আপডেট ট্রিগার করতে আমি দুটি ভিন্ন ইভেন্ট চাই। একটিতে ক্লিক করা হচ্ছে একটি বোতাম ( input$spec_button) এবং অন্যটি ক্লিক করা হচ্ছে এমন বিন্দুর বিন্দু ( mainplot.click$click)।

মূলত, আমি একই সাথে উভয়ের জন্য তালিকাবদ্ধ করতে চাই, তবে কোডটি কীভাবে লিখব তা নিশ্চিত নই। আমার এখন যা আছে তা এখানে:

সার্ভারে.আর:

data <- eventReactive({mainplot.click$click | input$spec_button}, {
    if(input$spec_button){
      # get data relevant to the button
    } else {
      # get data relevant to the point clicked
    }
  })

তবে যদি-অন্য ধারাটি কাজ করে না

Error in mainplot.click$click | input$spec_button : operations are possible only for numeric, logical or complex types

-> এই mainplot.click$click | input$spec_buttonধারাটির জন্য আমি ব্যবহার করতে পারি এমন কোনও ক্রিয়া-সংযুক্তকারী ফাংশন আছে কি ?


আপনি কি! Is.null (ইনপুট $ spec_button) এর আউটপুট চেক করতে পারেন?
গোপালা

উত্তর:


97

আমি জানি এটি পুরানো, তবে আমার একই প্রশ্ন ছিল। আমি অবশেষে এটি সন্ধান। আপনি ধনুর্বন্ধনী মধ্যে একটি অভিব্যক্তি অন্তর্ভুক্ত এবং কেবল ইভেন্ট / প্রতিক্রিয়াশীল অবজেক্ট তালিকাভুক্ত। আমার (অসমাপ্ত) অনুমান যে চকচকে কেবল স্ট্যান্ডার্ড reactiveব্লকের মতো এই এক্সপ্রেশন ব্লকে একই প্রতিক্রিয়াশীল পয়েন্টার বিশ্লেষণ করে ।

observeEvent({ 
  input$spec_button
  mainplot.click$click
  1
}, { ... } )

সম্পাদনা

কেসটি পরিচালনা করতে আপডেট হয়েছে যেখানে অভিব্যক্তিটির শেষ লাইনটি NULL দেয়। কেবল একটি ধ্রুবক মান ফিরে।


4
এটির উত্তর গ্রহণযোগ্য উত্তর পরিবর্তন করা কারণ এটি আমার আসল সমাধানের চেয়ে ভাল সমাধান বলে মনে হচ্ছে।
হিলারি স্যান্ডার্স

4
আপনি চিহ্নিত করতে পারবেন কোন ইভেন্টটি ট্রিগার হয়েছিল?
পিটারভেরমন্ট

আমার এরকম কিছু জানা নেই. আমি কয়েকটি ক্ষেত্রে এটি পৃথক ভেরিয়েবলের উপর নজর রাখার মাধ্যমে এবং যা পরিবর্তিত হয়েছে তা দেখার জন্য নিজেকে তুলনা করে এই কাজটি করেছি। তবে এটি কুরুচিপূর্ণ। সম্ভবত কোনও ফাংশনে মূল কোডটি রাখা আরও ভাল, তারপরে দুটি পর্যবেক্ষণ করুন যা fn কল করে এবং তারপরে প্রতিটি ইভেন্টের জন্য নির্দিষ্ট স্টাফ করে।
ডানকান ব্রাউন

8
কেবলমাত্র একটি সতর্কতা: ডিফল্টরূপে observeEventব্যবহার ignoreNULL = TRUEকরে যার অর্থ যদি mainplot.click$click(ফেরতের মান) হয় NULLতবে হ্যান্ডলারটি পরিবর্তিত হলেও কখনও কল করা হবে নাinput$spec_button । এই ফাঁদে পড়তে রোধ করতে আমি @ JustAnother এর উত্তরের মতো কিছু প্রস্তাব দেব।
গ্রেগ এল

4
আরেকটি সতর্কতা: আমার পরীক্ষায় আমি দেখতে পেলাম যে এই ব্র্যাকেট সিনট্যাক্স ( {}) প্রতিটি ইভেন্টের নিজস্ব নিউলাইনে থাকা প্রয়োজন, অন্যথায় পার্সার দ্বিতীয় ইভেন্টটির সাথে সাথেই এটি "পার্সে ত্রুটি ..." এ ব্যর্থ হয়। উদাহরণস্বরূপ, সমস্ত এক লাইনে: observeEvent({input$spec_button mainplot.click$click}, {...})ব্যর্থ হয়। @ জাস্টঅনথরের উত্তর এস 3 জেনেরিক কম্বাইন সিনট্যাক্স ( c()) ব্যবহার করে নিউলাইনগুলি নির্বিশেষে কাজ করে।
ব্রায়ান ডি

57

এছাড়াও:

observeEvent(c( 
  input$spec_button,
  mainplot.click$click
), { ... } )

6
এটি @ ডানঙ্ক্রাউন এর উত্তরের মতো দেখতে দেখতে, আমি এমন একটি পরিস্থিতি পেয়েছি যেখানে দুটি অ্যাকশন বোতাম দুটিই একটি মডেলকে ট্রিগার করে, এটি কাজ করে এবং {সংস্করণটি তা করেনি। আমি কেন অ্যাকাউন্টিং করতে পারি না তা এমন।
জন পল

4
এই উত্তরটি কীভাবে আলাদা (এবং আরও ভাল আইএমও)
এল

এইটি আমার পক্ষে কাজ করে না - আমি একটি ত্রুটি পেয়েছি (চকচকে 1.0.5)
পটোকন

কোন অনুষ্ঠানের সূত্রপাত হয়েছিল তা জানার কোনও উপায় আছে? আসুন বলতে পারি যে আমার কাছে দুটি বোতাম রয়েছে input$button1এবং input$button2এটি খুব আলাদা অনুরূপ কাজগুলি করে, কেবল একটি ভিন্ন সূচক দিয়ে। আমি কোডটি একাধিকবার অনুলিপি করা এড়াতে চাই কারণ আমি সূচকটি জানি না। ধন্যবাদ!
নিকস বোস

11

একটি প্রতিক্রিয়াশীল অবজেক্ট তৈরি করে আমি এই সমস্যাটি সমাধান করেছি এবং এটি ইভেন্টের পরিবর্তন অভিব্যক্তিতে ব্যবহার করেছি। নীচের হিসাবে:

xxchange <- reactive({
paste(input$filter , input$term)
})

output$mypotput <- eventReactive( xxchange(), {
...
...
...
} )

4
এটি একটি খুব ভাল উত্তর যা আরও ব্যাখ্যা থেকে উপকৃত হতে পারে। যদিও গৃহীত উত্তরটি আরও সহজবোধ্যভাবে প্রাথমিক কর্মসূচীর জন্য আরও ভাল করে তুলেছে, এই উত্তরটি বৃহত এবং জটিল কোডগুলির পক্ষে আরও উপযুক্ত। উত্তরটি থেকে দুটি পয়েন্ট অনুপস্থিত বলে মনে হচ্ছে (1) পেস্ট করুন (বা তালিকা) কোডটিকে আরও কমপ্যাক্ট করে দুটি ইভেন্টকে একই লাইনে ফেলেছে। (২) যদি একাধিক শ্রোতা একই সংখ্যার ইভেন্টের জন্য শ্রবণ করে থাকে তবে প্রতিক্রিয়াশীল বস্তু একই এবং দুটি একই ঘটনার পুনরাবৃত্তি করার প্রচেষ্টাটি সংরক্ষণ করে।
কৃষিবিদ

5

সমাধানটি আমি এখানে এনেছি: মূলত, একটি খালি reactiveValuesডেটা ধারক তৈরি করুন এবং তারপরে দুটি পৃথক observeEventদৃষ্টান্তের ভিত্তিতে এর মানগুলি সংশোধন করুন ।

  data <- reactiveValues()
  observeEvent(input$spec_button, {
    data$data <- get.focus.spec(input=input, premise=premise, 
                                itemname=input$dropdown.itemname, spec.info=spec.info)
  })
  observeEvent(mainplot.click$click, {
    data$data <- get.focus.spec(input=input, premise=premise, mainplot=mainplot(),
                                mainplot.click_focus=mainplot.click_focus(),
                                spec.info=spec.info)  
  })

4
list(mainplot.click$click, input$spec_button)ওপির উপায়ের জন্যও কাজ করবে ।
জন

1

এটি এখনও আপনার ক্রিয়াকে কোনও ভেক্টরে রেখে কেবল ইভেন্টআরেক্টিভ দিয়েই করা যেতে পারে।

eventReactive(
  c(input$spec_button, mainplot.click$click), 
{ ... } )

0

এখানে ধারণাটি একটি প্রতিক্রিয়াশীল ফাংশন তৈরি করা যা আপনি অবজারভেন্ট-এভেন্টে পাস করতে চান সেই শর্তটি কার্যকর করবে এবং তারপরে আপনি বিবৃতিটির বৈধতা পরীক্ষা করতে এই প্রতিক্রিয়াশীল ফাংশনটি পাস করতে পারবেন। এই ক্ষেত্রে:

validate_event <- reactive({
    # I have used OR condition here, you can use AND also
    req(input$spec_button) || req(mainplot.click$click)
})

observeEvent(validate_event(), 
    { ... } 
)

কোডিং রাখুন!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.