যখন আমার জিপিপ্লট 2 সিনট্যাক্স বুদ্ধিমান হয় তখন আমি কীভাবে আর সিএমডি চেক "গ্লোবাল ভেরিয়েবলের জন্য কোনও দৃশ্যমান বাইন্ডিং" নোটগুলি পরিচালনা করতে পারি?


180

সম্পাদনা: হ্যাডলি উইকহাম উল্লেখ করেছেন যে আমি ভুল বানান। আর সিএমডি চেক সতর্কতা নয়, নোট নিক্ষেপ করছে। আমি বিভ্রান্তির জন্য ভীষণ দুঃখিত। এটা আমার তদারকি ছিল।

সংক্ষিপ্ত সংস্করণ

R CMD checkআমি যখনই ggplot2- তে বুদ্ধিমান প্লট-তৈরি বাক্য গঠন ব্যবহার করি তখন এই নোটটি ছুঁড়ে দেয় :

no visible binding for global variable [variable name]

আমি বুঝতে পেরেছি কেন আর সিএমডি চেক এটি করে, তবে মনে হয় এটি অন্যথায় বুদ্ধিমান সিনট্যাক্সের পুরো শিরাটিকে অপরাধী করে তুলেছে। আমি নিশ্চিত নই যে আমার প্যাকেজটি পাস R CMD checkএবং সিআরএএন-এ ভর্তি হওয়ার জন্য কী পদক্ষেপ নিতে হবে ।

পটভূমি

সাসচা এপসক্যাম্প আগে একই সমস্যাটিতে পোস্ট করেছিল । আমি মনে করি পার্থক্যটি হ'ল subset()এর ম্যানপেজটি বলেছে এটি ইন্টারেক্টিভ ব্যবহারের জন্য ডিজাইন করা হয়েছে

আমার ক্ষেত্রে, সমস্যাটি শেষ হয়নি, subset()তবে এর মূল বৈশিষ্ট্যটির সাথে ggplot2: data =আর্গুমেন্ট।

আমি কোডের একটি উদাহরণ লিখি যা এই নোটগুলি উত্পন্ন করে

এখানে একটি উপ-ফাংশন মধ্যে আমার প্যাকেজ যে একটি চক্রান্ত পয়েন্ট যোগ করেছেন:

JitteredResponsesByContrast <- function (data) {
  return(
    geom_point(
             aes(
               x = x.values, 
               y = y.values
             ),
             data     = data,
             position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
    )
  )
}

R CMD check, এই কোডটি বিশ্লেষণ করার সময়, বলবে

granovagg.contr : JitteredResponsesByContrast: no visible binding for
  global variable 'x.values'
granovagg.contr : JitteredResponsesByContrast: no visible binding for
  global variable 'y.values'

আর সিএমডি চেক কেন ঠিক আছে

চেকটি প্রযুক্তিগতভাবে সঠিক। x.valuesএবংy.values

  • ফাংশন স্থানীয়ভাবে সংজ্ঞায়িত করা হয় না JitteredResponsesByContrast()
  • ফর্মটিতে x.values <- [something]বিশ্বব্যাপী বা কলারের মধ্যে প্রাক-সংজ্ঞায়িত নয় ।

পরিবর্তে, তারা এমন ডেটাফ্রেমের মধ্যে ভেরিয়েবল যা আগে সংজ্ঞায়িত হয়ে ফাংশনে প্রবেশ করে JitteredResponsesByContrast()

Ggplot2 কেন আর সিএমডি চেককে সন্তুষ্ট করা কঠিন করে তুলেছে

ggplot2 মনে হয় একটি dataযুক্তির ব্যবহারকে উত্সাহিত করবে । তথ্য যুক্তি, সম্ভবতঃ এই কোডটি কার্যকর করা হবে

library(ggplot2)
p <- ggplot(aes(x = hwy, y = cty), data = mpg)
p + geom_point()

তবে এই কোডটি একটি অবজেক্ট-না-পাওয়া ত্রুটি তৈরি করবে:

library(ggplot2)
hwy # a variable in the mpg dataset

দুটি কাজের চারপাশ, এবং কেন আমি উভয়ই খুশি নই

NULLing কৌশল

ম্যাথু ডাওল প্রথমে NUL এ সমস্যাযুক্ত ভেরিয়েবলগুলি সেট করার পরামর্শ দিচ্ছেন , যা আমার ক্ষেত্রে এটির মতো দেখাবে:

JitteredResponsesByContrast <- function (data) {
  x.values <- y.values <- NULL # Setting the variables to NULL first
  return(
    geom_point(
             aes(
               x = x.values, 
               y = y.values
             ),
             data     = data,
             position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
    )
  )
}

আমি এই সমাধানটির প্রশংসা করি, তবে তিনটি কারণে এটি অপছন্দ করি।

  1. এটি সন্তুষ্ট করার বাইরে কোনও অতিরিক্ত উদ্দেশ্য কাজ করে না R CMD check
  2. এটি অভিপ্রায় প্রতিফলিত করে না। এটি প্রত্যাশা বাড়িয়ে তুলেছে যে aes()কলটি আমাদের এখনকার নূলে চলকগুলি দেখতে পাবে (এটি হবে না), আসল উদ্দেশ্যটিকে অস্পষ্ট করার সময় (আর সিএমডি চেকগুলি ভেরিয়েবল সম্পর্কে সচেতন করে তুলবে যা অন্যথায় জানতে পারে না যে এটি আবদ্ধ ছিল)
  3. 1 এবং 2 এর সমস্যাগুলি গুণিত হয় কারণ প্রতিবার যখন আপনি কোনও ফাংশন লিখেন যা কোনও প্লটের উপাদান দেয়, আপনাকে একটি বিভ্রান্তিকর NULLing বিবৃতি যুক্ত করতে হবে

() কৌশল সহ

আপনি with()স্পষ্টভাবে সিগন্যাল করতে ব্যবহার করতে পারেন যে প্রশ্নে ভেরিয়েবলগুলি আরও কিছু বৃহত পরিবেশের মধ্যে পাওয়া যায়। আমার ক্ষেত্রে, with()ব্যবহারটি এর মতো দেখাচ্ছে:

JitteredResponsesByContrast <- function (data) {
  with(data, {
      geom_point(
               aes(
                 x = x.values, 
                 y = y.values
               ),
               data     = data,
               position = position_jitter(height = 0, width = GetDegreeOfJitter(jj))
      )
    }
  )
}

এই সমাধান কাজ করে। তবে, আমি এই সমাধানটি পছন্দ করি না কারণ এটি এমনভাবে কাজ করে না যা আমি আশা করি। যদি with()ভেরিয়েবলগুলি যেখানে দোভাষীকে নির্দেশ করার সমস্যাটি যদি সত্যিই সমাধান করা হয় তবে আমার পক্ষে যুক্তিও লাগবে না data =। তবে, with()সেভাবে কাজ করে না:

library(ggplot2)
p <- ggplot()
p <- p + with(mpg, geom_point(aes(x = hwy, y = cty)))
p # will generate an error saying `hwy` is not found

সুতরাং, আমি আবারও মনে করি, এই সমাধানটির NULLing কৌশল সম্পর্কিত একই ত্রুটি রয়েছে:

  1. আমাকে এখনও প্রতিটি প্লট উপাদান ফাংশনটি দিয়ে যেতে হবে এবং যুক্তিটি একটিতে আবৃত করতে হবে with() কলটিতে হবে
  2. with()কল বিভ্রান্তিকর করা হয়। আমার এখনও একটি data =যুক্তি সরবরাহ করা দরকার ; সব with()করছে আনন্দিত R CMD check

উপসংহার

আমি এটি যেভাবে দেখছি, সেখানে তিনটি বিকল্প থাকতে পারে:

  1. লবি সিআরএএন নোটগুলি এটিকে "উত্সাহী" ( সিআরআন নীতি অনুসারে ) বলে তুচ্ছ করে তা উপেক্ষা করার জন্য , এবং প্রতিবারই আমি কোনও প্যাকেজ জমা দিলে তা করুন
  2. দুটি অনাকাঙ্ক্ষিত কৌশলগুলির মধ্যে একটির সাথে আমার কোডটি ঠিক করুন (নুলিং বা with()ব্লক)
  3. হুম সত্যই উচ্চস্বরে এবং আশা করি সমস্যাটি চলে যাবে

এই তিনজনের কেউই আমাকে খুশি করতে পারে না এবং আমি ভাবছি যে লোকেরা আমাকে কী পরামর্শ দেয় (এবং অন্যান্য প্যাকেজ বিকাশকারীরা ggplot2 এ ট্যাপ করতে চায়) কী করা উচিত। সকলকে আগাম ধন্যবাদ। আমি এই মাধ্যমে আপনার এমনকি পড়া সত্যিই প্রশংসা :-)


20
আমি # 1 এবং # 3 পছন্দ করি।
বেন বলকার

8
@ বেনবোলকার এগুলিও আমার কাছে যাওয়ার কৌশল।
হ্যাডলি

6
চতুর্থ বিকল্প রয়েছে: 'আর সিএমডি চেক' সংশোধন করুন এবং বিবেচনা করার জন্য একটি প্যাচ আর-ডেভেলটিতে জমা দিন। আমার সন্দেহ হয় যে আপনি কোনটি উদ্দীপক এবং কোনটি নয় তা সনাক্ত করা আপনার পক্ষে বেশ কঠিন (এবং সম্ভবত অসম্ভব) find যদি কেউ কিছু করার জন্য কোনও কোডের টুকরো নিয়ে আসে তবে ...
ম্যাট ডাউলে

6
অন্য কৌশলটি হ'লaes_string
হ্যাডলি

2
এটি মনে হয় transformএবং subsetএটিও খুব সমস্যা (100% নিশ্চিত নয়, তবে এটি বোধগম্য)।
ব্রোডিজি

উত্তর:


44

আপনি কি এর aes_stringপরিবর্তে চেষ্টা করেছেন aes? এটি কাজ করা উচিত, যদিও আমি এটি চেষ্টা করি নি:

aes_string(x = 'x.values', y = 'y.values')

4
শুধু একটি সতর্কতা: aesযখন আছে aes_stringঅবস্থানগত পরামিতি সংজ্ঞায়িত না xএবং y
topchef

6
ঠিক অন্য একটি সতর্কতা। aes_string আপনাকে এক্স এবং ওয়াইয়ের মানগুলি কার্যকর করতে ফাংশন ব্যবহার করতে দেয় না। বলুন যে আপনি লগ করতে চান রূপান্তর y এর ক্ষেত্রে অবশ্যই aes_string (x = 'x.values', y = 'লগ (y.values)') অবশ্যই কাজ করে না। আমি নিজেকে এই ধরণের রূপান্তরগুলি অনেকটা ব্যবহার করি তাই এসিএসস্ট্রিং সবসময় আমার পক্ষে বিকল্প নয়।
ডঃ মাইক

সম্ভবত এই উত্তরটি (এবং সবচেয়ে বেশি ভোট সহ একটি) আপডেট করা উচিত যেহেতু ডকুমেন্টেশন aes_stringবলে: "এই সমস্ত ফাংশনগুলি নরম-অবমূল্যায়িত instead (ggplot2 সংস্করণ 3.2.1)। এটি সম্ভবত rlang::.dataএই নোটগুলি নীরব করার জন্য সেরা প্রার্থীকে তৈরি করে।
ভ্যান্ডেনম্যান

85

আপনার দুটি সমাধান রয়েছে:

  • অ-মানক মূল্যায়ন এড়াতে আপনার কোডটি পুনরায় লিখুন। Ggplot2 এর জন্য, এর aes_string()পরিবর্তে aes()(হার্লান বর্ণিত হিসাবে) ব্যবহার করা হচ্ছে

  • globalVariables(c("x.values", "y.values"))আপনার প্যাকেজের শীর্ষ স্তরের কোথাও কল যুক্ত করুন ।

সিআরএএন-তে জমা দেওয়ার সময় আপনার প্যাকেজে 0 টি নোটের জন্য চেষ্টা করা উচিত, এমনকি কিছুটা হ্যাক করা হলেও আপনাকে কিছু করতে হবে। এটি ক্র্যানের জন্য জীবনকে সহজ এবং আপনার পক্ষে সহজ করে তোলে।

(এটি সম্পর্কে আমার সর্বশেষ চিন্তাগুলি প্রতিফলিত করতে 2014-12-31 আপডেট হয়েছে)


26
globalVariablesএটি একটি জঘন্য হ্যাক এবং আমি এটি কখনই ব্যবহার করব না।
হ্যাডলি

10
মূল্যবান হিসাবে, এই নোটগুলির কারণে আমার প্যাকেজ জমা দেওয়ার বিষয়টি প্রত্যাখ্যান করা হয়েছিল এবং ইউএস :: গ্লোবাল ভেরিয়েবল ফাংশনটি ব্যবহার করতে বলা হয়েছিল। যেহেতু আমি তর্ক করার মতো অবস্থানে নেই, তাই আমি এটি করেছি।
jbryer

9
আমি সম্মত এটি তাদের উপেক্ষা সেরা হতে পারে, কিন্তু এর আমার কোড ব্যবহার প্রচুর ggplotএবং data.table, এবং এইভাবে হয়েছে টন এই সতর্কবার্তা, যা আমাকে অন্য আরো গুরুত্বপূর্ণ সতর্কবার্তা যে সত্যিই সমস্যার আমি ফিক্স করা প্রয়োজন ছিল ঠাহর থেকে রেখেছ করুন।
কেন উইলিয়ামস

108
@ হ্যাডলি আপনার এই কথাটি বলা উচিত নয় যে আপনি কখনই জিনিসগুলি ব্যবহার করবেন না যখন কেবল দু'বছর পরে যখন আপনি মনে করেন এটি ভাল
হ্যাডলি

10
নতুন বছরের রেজুলেশন? আমি ggplot::scale_dualAxis.sqrtভরাট নিদর্শন সহ আমার চোখ খোলা রাখব এবং 3 ডি পাই চার্ট রাখব ।
baptiste

29

এই প্রশ্নটি জিজ্ঞাসা করা হয়েছে এবং কিছুক্ষণ আগে উত্তর দেওয়া হয়েছে তবে কেবল আপনার তথ্যের জন্য, সংস্করণ ২.১.০ থেকে নোটগুলি ঘুরে দেখার আরও একটি উপায় আছে:aes_(x=~x.values,y=~y.values).


12

যদি

getRversion() >= "3.1.0"

আপনি প্যাকেজের শীর্ষ স্তরে একটি কল যুক্ত করতে পারেন:

utils::suppressForeignCheck(c("x.values", "y.values"))

থেকে:

help("suppressForeignCheck")

3
এটি একটি সুষ্ঠু সমাধান। ধন্যবাদ! আমি এটি বিবেচনা করতাম, তবে সমস্যাটি হ'ল আমার মতো অনেকগুলি ভেরিয়েবল রয়েছে x.valuesএবং y.valuesতাই আমাকে তাদের সমস্তটি নিবন্ধ করতে হবে।
ব্রিচেন্ড

4
suppressForeignCheck
হ্যাডলি

10
আসলে শীর্ষ স্তরটি কোথায় ? আমি কোন ফাইলটিতে এই আদেশটি যুক্ত করব?
ড্রামারিড

9
কাস্টম অনুসারে, এটি একটি zzz.Rফাইলের মধ্যে রাখা হয় ./R/। উদাহরণস্বরূপ, github.com/HughParsonage/grattan/blob/master/R/zzz.R
হিউ

6
@ হ্যাডলি, এটি কিসের জন্য ব্যবহৃত হয়? সহায়তা ("suppressForeignCheck") বোঝায় যে এটি "রান-টাইম গণনা করা দেশীয় প্রতীক" এর জন্য, তবে হ্যাকটি কী?
পিডিবি

8

2019 সালে, এর কাছাকাছি যাওয়ার সর্বোত্তম উপায় হ'ল প্যাকেজ .dataথেকে উপসর্গটি ব্যবহার করা rlang। এই চিকিত্সার জন্য আর বলে x.valuesএবং y.valuesএকটি কলাম হিসাবেdata.frame (তাই এটা অনির্ধারিত ভেরিয়েবল সম্পর্কে অভিযোগ করা হবে না)।

দ্রষ্টব্য: এটি যদি আপনার পূর্বনির্ধারিত কলামগুলির নামগুলি থাকে যা আপনার জানা ইনপুটটিতে উপস্থিত থাকে তবে এটি সর্বোত্তম কাজ করে

#' @importFrom rlang .data
my_func <- function(data) {
    ggplot(data, aes(x = .data$x, y = .data$y))
}

3

আপনি যে প্যাকেজ-স্তরীয় ডকুমেন্টেশন সরবরাহ করেন সেই ফাইলটিতে কোডের এই লাইনটি যুক্ত করুন:

if(getRversion() >= "2.15.1")  utils::globalVariables(c("."))

উদাহরণ এখানে

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