আমি কোনও ফাংশনের উত্স কোডটি কীভাবে দেখতে পারি?


550

কোনও ফাংশন এটি কীভাবে কাজ করে তা দেখতে আমি সোর্স কোডটি দেখতে চাই। আমি জানি আমি প্রম্পটে নামটি টাইপ করে একটি ফাংশন মুদ্রণ করতে পারি:

> t
function (x) 
UseMethod("t")
<bytecode: 0x2332948>
<environment: namespace:base>

এই ক্ষেত্রে, এর UseMethod("t")অর্থ কী? আমি সোর্স কোড যে আসলে দ্বারা ব্যবহৃত হচ্ছে, উদাহরণস্বরূপ কিভাবে পেলে: t(1:10)?

আমি কখন দেখি UseMethodএবং কখন দেখি standardGenericএবং showMethodsসাথেও কি পার্থক্য রয়েছে with?

> with
standardGeneric for "with" defined from package "base"

function (data, expr, ...) 
standardGeneric("with")
<bytecode: 0x102fb3fc0>
<environment: 0x102fab988>
Methods may be defined for arguments: data
Use  showMethods("with")  for currently available ones.

অন্যান্য ক্ষেত্রে, আমি দেখতে পাচ্ছি যে আর ফাংশনগুলি ডাকা হচ্ছে, কিন্তু আমি এই ফাংশনগুলির উত্স কোডটি খুঁজে পাই না।

> ts.union
function (..., dframe = FALSE) 
.cbind.ts(list(...), .makeNamesTs(...), dframe = dframe, union = TRUE)
<bytecode: 0x36fbf88>
<environment: namespace:stats>
> .cbindts
Error: object '.cbindts' not found
> .makeNamesTs
Error: object '.makeNamesTs' not found

আমি .cbindtsএবং এর মতো ফাংশনগুলি কীভাবে সন্ধান করব .makeNamesTs?

অন্যান্য ক্ষেত্রেও কিছুটা আর কোড রয়েছে তবে বেশিরভাগ কাজ অন্য কোথাও হয়েছে বলে মনে হয়।

> matrix
function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
{
    if (is.object(data) || !is.atomic(data)) 
        data <- as.vector(data)
    .Internal(matrix(data, nrow, ncol, byrow, dimnames, missing(nrow), 
        missing(ncol)))
}
<bytecode: 0x134bd10>
<environment: namespace:base>
> .Internal
function (call)  .Primitive(".Internal")
> .Primitive
function (name)  .Primitive(".Primitive")

.Primitiveফাংশনটি কী করে তা আমি কীভাবে খুঁজে বের করব ? একইভাবে, কিছু ফাংশন কল .C, .Call, .Fortran, .External, অথবা.Internal । আমি কীভাবে তাদের জন্য উত্স কোডটি সন্ধান করতে পারি?




উত্তর:


518

UseMethod("t")আপনাকে জানিয়ে দিচ্ছি যে t()একটি ( এস 3 ) জেনেরিক ফাংশন যার বিভিন্ন অবজেক্ট শ্রেণির জন্য পদ্ধতি রয়েছে।

এস 3 পদ্ধতি প্রেরণ সিস্টেম

এস 3 ক্লাসের জন্য, আপনি methodsনির্দিষ্ট জেনেরিক ফাংশন বা শ্রেণীর জন্য পদ্ধতিগুলি তালিকাভুক্ত করতে ফাংশনটি ব্যবহার করতে পারেন ।

> methods(t)
[1] t.data.frame t.default    t.ts*       

   Non-visible functions are asterisked
> methods(class="ts")
 [1] aggregate.ts     as.data.frame.ts cbind.ts*        cycle.ts*       
 [5] diffinv.ts*      diff.ts          kernapply.ts*    lines.ts        
 [9] monthplot.ts*    na.omit.ts*      Ops.ts*          plot.ts         
[13] print.ts         time.ts*         [<-.ts*          [.ts*           
[17] t.ts*            window<-.ts*     window.ts*      

   Non-visible functions are asterisked

"অ-দৃশ্যমান ফাংশনগুলি asterisked হয়" অর্থ ফাংশনটি তার প্যাকেজের নাম স্থান থেকে রফতানি করা হয় না। আপনি এখনও মাধ্যমে তার সোর্স কোড দেখতে পারেন :::(যেমন ফাংশন stats:::t.ts), অথবা ব্যবহার করে getAnywhere()getAnywhere()দরকারী কারণ আপনি কোন প্যাকেজটি প্যাকেজটি এসেছিলেন তা জানতে হবে না।

> getAnywhere(t.ts)
A single object matching ‘t.ts’ was found
It was found in the following places
  registered S3 method for t from namespace stats
  namespace:stats
with value

function (x) 
{
    cl <- oldClass(x)
    other <- !(cl %in% c("ts", "mts"))
    class(x) <- if (any(other)) 
        cl[other]
    attr(x, "tsp") <- NULL
    t(x)
}
<bytecode: 0x294e410>
<environment: namespace:stats>

এস 4 পদ্ধতি প্রেরণ সিস্টেম

এস 4 সিস্টেমটি একটি নতুন পদ্ধতি প্রেরণ সিস্টেম এবং এস 3 সিস্টেমের বিকল্প। এখানে একটি এস 4 ফাংশনের উদাহরণ রয়েছে:

> library(Matrix)
Loading required package: lattice
> chol2inv
standardGeneric for "chol2inv" defined from package "base"

function (x, ...) 
standardGeneric("chol2inv")
<bytecode: 0x000000000eafd790>
<environment: 0x000000000eb06f10>
Methods may be defined for arguments: x
Use  showMethods("chol2inv")  for currently available ones.

আউটপুট ইতিমধ্যে প্রচুর তথ্য সরবরাহ করে। standardGenericএটি একটি এস 4 ফাংশনের সূচক। সংজ্ঞায়িত এস 4 পদ্ধতিগুলি দেখার পদ্ধতিটি সহায়কভাবে দেওয়া হয়:

> showMethods(chol2inv)
Function: chol2inv (package base)
x="ANY"
x="CHMfactor"
x="denseMatrix"
x="diagonalMatrix"
x="dtrMatrix"
x="sparseMatrix"

getMethod পদ্ধতির একটির সোর্স কোড দেখতে ব্যবহার করা যেতে পারে:

> getMethod("chol2inv", "diagonalMatrix")
Method Definition:

function (x, ...) 
{
    chk.s(...)
    tcrossprod(solve(x))
}
<bytecode: 0x000000000ea2cc70>
<environment: namespace:Matrix>

Signatures:
        x               
target  "diagonalMatrix"
defined "diagonalMatrix"

প্রতিটি পদ্ধতির আরও জটিল স্বাক্ষর সহ এমন পদ্ধতিও রয়েছে, উদাহরণস্বরূপ

require(raster)
showMethods(extract)
Function: extract (package raster)
x="Raster", y="data.frame"
x="Raster", y="Extent"
x="Raster", y="matrix"
x="Raster", y="SpatialLines"
x="Raster", y="SpatialPoints"
x="Raster", y="SpatialPolygons"
x="Raster", y="vector"

এর মধ্যে একটি পদ্ধতির উত্স কোড দেখতে সম্পূর্ণ স্বাক্ষর সরবরাহ করতে হবে, যেমন

getMethod("extract" , signature = c( x = "Raster" , y = "SpatialPolygons") )

আংশিক স্বাক্ষর সরবরাহ করার জন্য এটি পর্যাপ্ত হবে না

getMethod("extract",signature="SpatialPolygons")
#Error in getMethod("extract", signature = "SpatialPolygons") : 
#  No method found for function "extract" and signature SpatialPolygons

যে ক্রিয়াকলাপগুলি অনির্বাচিত ফাংশনগুলিকে কল করে

ক্ষেত্রে ts.union, .cbindtsএবং নেমস্পেস .makeNamesTsথেকে অপ্রত্যাশিত ফাংশনগুলি stats। আপনি :::অপারেটর ব্যবহার করে বা অপ্রয়োজনীয় ফাংশনগুলির উত্স কোড দেখতে পারেন getAnywhere

> stats:::.makeNamesTs
function (...) 
{
    l <- as.list(substitute(list(...)))[-1L]
    nm <- names(l)
    fixup <- if (is.null(nm)) 
        seq_along(l)
    else nm == ""
    dep <- sapply(l[fixup], function(x) deparse(x)[1L])
    if (is.null(nm)) 
        return(dep)
    if (any(fixup)) 
        nm[fixup] <- dep
    nm
}
<bytecode: 0x38140d0>
<environment: namespace:stats>

সংযুক্ত কোড কল যে ফাংশন

নোট করুন যে "সংকলিত" সংকলক প্যাকেজটির দ্বারা তৈরি বাইট-সংকলিত আর কোডকে বোঝায় না । দ্য<bytecode: 0x294e410>উপরে আউটপুটে লাইন নির্দেশ করে ফাংশন বাইট-কম্পাইল যে, এবং আপনি এখনও আর কম্যান্ড লাইন থেকে উৎস দেখতে পারেন।

কার্যাবলী যে কল .C, .Call, .Fortran, .External, .Internal, অথবা .Primitiveকম্পাইল কোডে এন্ট্রি পয়েন্ট আহ্বান করা হয়, তাই আপনি কম্পাইল কোড উৎস তাকান যদি আপনি সম্পূর্ণরূপে ফাংশন বুঝতে চাই থাকবে। আর উত্স কোডের এই গিটহাব আয়নাটি শুরু করার জন্য একটি শালীন জায়গা। ফাংশনটি pryr::show_c_sourceএকটি দরকারী সরঞ্জাম হতে পারে কারণ এটি আপনাকে সরাসরি গিটহাব পৃষ্ঠায় নিয়ে যায় .Internalএবং .Primitiveকল করতে পারে। প্যাকেজগুলি ব্যবহার করতে পারেন .C, .Call, .Fortran, এবং .External; কিন্তু না .Internalবা.Primitive , কারণ এগুলি আর ইন্টারপ্লেটারে অন্তর্নির্মিত ফাংশনগুলি কল করতে ব্যবহৃত হয়।

উপরের কয়েকটি ফাংশনগুলিতে কলগুলি সংকলিত ফাংশনটি উল্লেখ করতে অক্ষর স্ট্রিংয়ের পরিবর্তে কোনও অবজেক্ট ব্যবহার করতে পারে। সেসব ক্ষেত্রে, অবজেক্ট যেটা ক্লাসের হয় "NativeSymbolInfo", "RegisteredNativeSymbol"অথবা "NativeSymbol"; এবং অবজেক্টটি মুদ্রণ করলে দরকারী তথ্য পাওয়া যায়। উদাহরণস্বরূপ, optimকল .External2(C_optimhess, res$par, fn1, gr1, con)(নোট যে এর C_optimhessনা "C_optimhess")। optimপরিসংখ্যান প্যাকেজে রয়েছে তাই আপনি টাইপ করতে পারেনstats:::C_optimhess সংকলিত ফাংশনটির জন্য ডাকা হচ্ছে এমন তথ্য দেখতে করতে পারেন।

একটি প্যাকেজে কোড সংকলিত

আপনি যদি কোনও প্যাকেজে সংকলিত কোড দেখতে চান তবে আপনাকে প্যাকেজ উত্সটি ডাউনলোড / আনপ্যাক করতে হবে। ইনস্টলড বাইনারিগুলি পর্যাপ্ত নয়। প্যাকেজটির উত্স কোডটি একই ক্র্যান (বা CRAN সামঞ্জস্যপূর্ণ) সংগ্রহস্থল থেকে পাওয়া যায় যা প্যাকেজটি মূলত ইনস্টল করা হয়েছিল। download.packages()ফাংশন তোমার জন্য প্যাকেজ উৎস পেতে পারেন।

download.packages(pkgs = "Matrix", 
                  destdir = ".",
                  type = "source")

এটি ম্যাট্রিক্স প্যাকেজের উত্স সংস্করণ ডাউনলোড করবে এবং .tar.gzবর্তমান ডিরেক্টরিতে সংশ্লিষ্ট ফাইলটি সংরক্ষণ করবে । সংকলিত ফাংশনগুলির জন্য সোর্স কোডটি srcসঙ্কুচিত এবং অপরিশোধিত ফাইলের ডিরেক্টরিতে পাওয়া যাবে । আপত্তিজনক এবং অপরিবর্তনীয় পদক্ষেপটি বাইরে Rবা ফাংশনটি Rব্যবহারের মাধ্যমে করা যেতে untar()পারে। ডাউনলোড এবং সম্প্রসারণের পদক্ষেপটি একক কলের সাথে একত্রিত করা সম্ভব (নোট করুন যে একবারে কেবল একটি প্যাকেজ এইভাবে ডাউনলোড এবং আনপ্যাক করা যায়):

untar(download.packages(pkgs = "Matrix",
                        destdir = ".",
                        type = "source")[,2])

বিকল্পভাবে, যদি প্যাকেজ বিকাশটি সর্বজনীনভাবে হোস্ট করা হয় (যেমন গিটহাব , আর-ফোর্জ , বা আরফোরজ নেট এর মাধ্যমে ), আপনি সম্ভবত উত্স কোডটি ব্রাউজ করতে পারেন।

একটি বেস প্যাকেজে কোড সংকলিত

কিছু প্যাকেজগুলি "বেস" প্যাকেজ হিসাবে বিবেচিত হয়। এই প্যাকেজগুলি আর সঙ্গে অর্ণবপোত এবং তাদের সংস্করণ আর উদাহরণ সংস্করণ লক তা অন্তর্ভূক্ত base, compiler, stats, এবং utils। যেমন, উপরে বর্ণিত হিসাবে এগুলি CRAN এ আলাদা ডাউনলোডযোগ্য প্যাকেজ হিসাবে উপলভ্য নয়। বরং তারা পৃথক পৃথক প্যাকেজ ডিরেক্টরিতে আর উত্স গাছের অংশ /src/library/। কীভাবে আর উত্স অ্যাক্সেস করবেন তা পরবর্তী বিভাগে বর্ণিত হয়েছে।

আরপি ইন্টারপ্রেটারে সংকলিত কোড

আপনি যদি আর ইন্টারপ্রেটারের অন্তর্নির্মিত কোডটি দেখতে চান তবে আপনাকে আর উত্স ডাউনলোড / আনপ্যাক করতে হবে; অথবা আপনি আর সাবভার্সন সংগ্রহশালা বা উইনস্টন চ্যাংয়ের গিথুব আয়নার মাধ্যমে অনলাইনে উত্সগুলি দেখতে পারেন ।

উউই লিগেসের আর নিউজ নিবন্ধ (পিডিএফ) (পৃষ্ঠা 43) হ'ল সোর্স কোড .Internalএবং .Primitiveফাংশনগুলি কীভাবে দেখতে হবে তার একটি ভাল সাধারণ রেফারেন্স । প্রাথমিক পদক্ষেপগুলি হ'ল প্রথমে ফাংশনটির নামটি src/main/names.cঅনুসন্ধান করা এবং তারপরে ফাইলগুলিতে "সি-এন্ট্রি" নাম অনুসন্ধান করা src/main/*


71
আপনি যদি ব্যবহার RStudioকরেন তবে আপনি F2কীটি চাপলে আপনার পাঠ্য কার্সারটি শেষ হয়ে যায় এমন ফাংশনের উত্সটি টানতে চেষ্টা করবে ।
আরি বি ফ্রেডম্যান

1
@ আরি বি ফ্রেডম্যান এই দেরী প্রশ্নের জন্য দুঃখিত। আরস্টুডিওও কি ফাংশনের জন্য সি উত্স কোডটি টানবে বা কেবল আর-তে লেখা ফাংশনগুলির জন্য? ধন্যবাদ
সানি

3
@ সমীর আমি বিশ্বাস করি এটি কেবল আর উত্স।
এরি বি ফ্রেডম্যান

@ আরিবি.ফ্রিডম্যান - ধন্যবাদ অরি, এটি সুবিধাজনক। আমার ক্ষেত্রে আমার এখনও উত্তরটিতে প্রদর্শিত জ্ঞান প্রয়োজন ( scaleযা এস 3 - আমি পেয়েছি UseMethod("scale")এবং তারপরে ব্যবহার করেছি getAnywhere(scale.default))। কিন্তু সরল ফাংশন ঠিক কাজ করে।
টমাসজ গ্যান্ডার


94

এই প্রশ্নের অন্যান্য উত্তর এবং এর সদৃশ ছাড়াও, কোন প্যাকেজটি রয়েছে তা না জেনে প্যাকেজ ফাংশনের জন্য উত্স কোড পাওয়ার একটি ভাল উপায় eg উদাহরণস্বরূপ যদি আমরা উত্সটি চাই randomForest::rfcv():

করতে দেখা / সম্পাদনার একটি পপ-আপ উইন্ডোতে এটা:

edit(getAnywhere('rfcv'), file='source_rfcv.r')

করার একটি পৃথক ফাইলে পুনর্নির্দেশ :

capture.output(getAnywhere('rfcv'), file='source_rfcv.r')

স্বীকার করা যায় যে, getAnywhere হ'ল নামের একটি অপ্রয়োজনীয় আর পছন্দ, যা ফাইন্ডঅনসন্ধানপথ বা অনুরূপ বলা উচিত ছিল ।
স্মি

1
আমি এই উত্তরটিকে উজ্জীবিত করব কারণ এটি আমার যা চেয়েছিল তা কাছে পেয়েছে। আরস্টুডিওতে আমি আসলে যা চেয়েছিলাম তা ছিল View(foo); যেখানে fooইতিমধ্যে লোড হওয়া প্যাকেজ থেকে একটি ফাংশন ছিল।
সিগফ্রিড

1
@ সিগফ্রিড: edit()একটি পাঠ্য সম্পাদক খুলুন (ব্যবহারকারীর পছন্দের) , যেখানে তথ্যেরView() জন্য একটি এক্সেল ধরণের স্প্রেডশিট ভিউয়ার খোলে , পরেরটি ব্রাউজিং (বহু-কলামার) ডেটার জন্য ভাল তবে খেলনার দৈর্ঘ্য ব্যতীত অন্য যে কোনও কোডের জন্য সাধারণত ভয়ানক। উদাহরণ হিসেবে বলা যায় আমি এ প্রজ্ঞান যেমন, সাধারণত প্রথম জিনিস আমি একটি ফাংশন ব্রাউজিং কাজ করতে চান লাফালাফি / সঙ্কুচিত / আউট সব ARG-পার্সিং এবং ডিফল্ট অ্যাকশন যুক্তিবিজ্ঞান ডামি, কি ফাংশন আসলে দেখতে হয় না
স্মি

25

আপনি ডিবাগ () ফাংশনটি ব্যবহার করে ডিবাগ করার সময় এটি প্রকাশ পায়। ধরুন আপনি টি () ট্রান্সপোজ ফাংশনে অন্তর্নিহিত কোডটি দেখতে চান। শুধু 't' টাইপ করলে অনেক কিছুই প্রকাশ পায় না।

>t 
function (x) 
UseMethod("t")
<bytecode: 0x000000003085c010>
<environment: namespace:base>

তবে, 'ডিবাগ (ফাংশননাম)' ব্যবহার করে এটি অন্তর্নিহিত কোডটি প্রকাশ করে, ইন্টার্নালগুলি সান করে।

> debug(t)
> t(co2)
debugging in: t(co2)
debug: UseMethod("t")
Browse[2]> 
debugging in: t.ts(co2)
debug: {
    cl <- oldClass(x)
    other <- !(cl %in% c("ts", "mts"))
    class(x) <- if (any(other)) 
        cl[other]
    attr(x, "tsp") <- NULL
    t(x)
}
Browse[3]> 
debug: cl <- oldClass(x)
Browse[3]> 
debug: other <- !(cl %in% c("ts", "mts"))
Browse[3]> 
debug: class(x) <- if (any(other)) cl[other]
Browse[3]>  
debug: attr(x, "tsp") <- NULL
Browse[3]> 
debug: t(x)

সম্পাদনা: ডিবাগনস () Undebug () ব্যবহার না করেই এটি সম্পাদন করে


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

হ্যাঁ, এটি অনুকূল নয়। তবে আপনি যদি চালাক হন তবে আপনি উত্সটি দ্রুত এবং নোংরা পেতে পারেন, অন্তর্নির্মিত কার্যগুলির জন্য esp।
সেলভা

2
আমি এই উদাহরণের debugonceপরিবর্তে ব্যবহার করার পরামর্শ দেব debug
জোশুয়া উলরিচ

20

অ-আদিম ক্রিয়াকলাপগুলির জন্য, আর বেজে একটি ফাংশন অন্তর্ভুক্ত যা ফাংশনটির body()দেহকে ফিরিয়ে দেয়। উদাহরণস্বরূপ print.Date()ফাংশনের উত্সটি দেখা যায়:

body(print.Date)

এটি উত্পাদন করবে:

{
    if (is.null(max)) 
        max <- getOption("max.print", 9999L)
    if (max < length(x)) {
        print(format(x[seq_len(max)]), max = max, ...)
        cat(" [ reached getOption(\"max.print\") -- omitted", 
            length(x) - max, "entries ]\n")
    }
    else print(format(x), max = max, ...)
    invisible(x)
}

আপনি যদি কোনও স্ক্রিপ্টে কাজ করছেন এবং একটি চরিত্রের ভেক্টর হিসাবে ফাংশন কোড চান, আপনি এটি পেতে পারেন।

capture.output(print(body(print.Date)))

আপনি পাবেন:

[1] "{"                                                                   
[2] "    if (is.null(max)) "                                              
[3] "        max <- getOption(\"max.print\", 9999L)"                      
[4] "    if (max < length(x)) {"                                          
[5] "        print(format(x[seq_len(max)]), max = max, ...)"              
[6] "        cat(\" [ reached getOption(\\\"max.print\\\") -- omitted\", "
[7] "            length(x) - max, \"entries ]\\n\")"                      
[8] "    }"                                                               
[9] "    else print(format(x), max = max, ...)"                           
[10] "    invisible(x)"                                                    
[11] "}"     

আমি কেন এমন কিছু করতে চাইব? আমি একটি তালিকার উপর নির্ভর করে একটি কাস্টম এস 3 অবজেক্ট ( xযেখানে class(x) = "foo") তৈরি করছিলাম । তালিকার অন্যতম সদস্য (যার নাম "মজাদার") ছিল একটি ফাংশন এবং আমি print.foo()ফাংশন উত্স কোডটি ইন্ডেন্ট করে প্রদর্শন করতে চেয়েছিলাম । সুতরাং আমি নিম্নলিখিত স্নিপেট এ শেষ print.foo():

sourceVector = capture.output(print(body(x[["fun"]])))
cat(paste0("      ", sourceVector, "\n"))

যা অন্তর্ভুক্ত করে এবং এর সাথে সম্পর্কিত কোডটি প্রদর্শন করে x[["fun"]]


18

মূল উত্তরের প্রবাহে এটি কীভাবে ফিট করে তা দেখেনি তবে এটি আমাকে কিছুক্ষণ থামিয়ে দিয়েছে তাই আমি এটি এখানে যুক্ত করছি:

ইনফিক্স অপারেটর

কিছু বেস পোতা অপারেটার (যেমন, সোর্স কোড দেখার জন্য %%, %*%, %in%), ব্যবহার getAnywhere, যেমন:

getAnywhere("%%")
# A single object matching ‘%%’ was found
# It was found in the following places
#   package:base
#   namespace:base
#  with value
#
# function (e1, e2)  .Primitive("%%")

প্রধান উত্তরটি এরপরে গভীর খনন করতে কীভাবে আয়নাগুলি ব্যবহার করবেন তা কভার করে।


6
smci এর উত্তর প্রস্তাবিত getAnywhere। অথবা আপনি শুধু ব্যাকটিক যদি আপনি ইতিমধ্যে অপারেটর নাম জানেন ব্যবহার করতে পারে: `%in%`
জোশুয়া আলরিখ

3
@ জোশুয়াউলিরিচ জানতেন না আপনি ব্যাকটিক্স ব্যবহার করতে পারবেন! ধন্যবাদ। getAnywhereআপনার উত্তরেও উল্লেখ করা হয়েছে, তবে আমি মনে করি ইনফিক্সের একটি নির্দিষ্ট রেফারেন্স এই উত্তরের ভবিষ্যতের রেফারেন্সের জন্য দরকারী - আমি এই পৃষ্ঠাটি অনেকবার পড়েছি এবং এখনও এইরকম ফাংশনগুলির জন্য কোড সন্ধান করার জন্য কিছুটা হতবাক হয়ে পড়েছিলাম যখন - এবং আমি এটি অন্য কোনও উত্তরের প্রবাহের সাথে খাপ খায়নি (যা উভয়ই getAnywhereঅন্য উদ্দেশ্যে ব্যবহৃত হচ্ছে)।
মাইকেলচিরিকো

10

আর-তে খুব কার্যকরী ফাংশন রয়েছে edit

new_optim <- edit(optim)

এটি optimআর এর মধ্যে উল্লিখিত সম্পাদকটি ব্যবহারের উত্স কোডটি খুলবে optionsএবং তারপরে আপনি এটিকে সম্পাদনা করতে এবং পরিবর্তিত ফাংশনটি নির্ধারণ করতে পারবেন new_optim। কোড দেখতে বা কোডটি ডিবাগ করার জন্য আমি এই ফাংশনটি খুব পছন্দ করি যেমন, কিছু বার্তা বা ভেরিয়েবল মুদ্রণ করতে এমনকি এমনকি আরও তদন্তের জন্য একটি বিশ্বব্যাপী ভেরিয়েবলগুলিতেও তাদের নিয়োগ (অবশ্যই আপনি ব্যবহার করতে পারেন debug)।

যদি আপনি কেবল উত্স কোডটি দেখতে চান এবং আপনার কনসোলটিতে বিরক্তিকর দীর্ঘ উত্স কোডটি না চান তবে আপনি ব্যবহার করতে পারেন

invisible(edit(optim))

স্পষ্টতই, এটি সি / সি ++ বা ফোর্টরান উত্স কোড দেখতে ব্যবহার করা যাবে না।

বিটিডাব্লু, editতালিকা, ম্যাট্রিক্স ইত্যাদির মতো অন্যান্য অবজেক্টগুলি খুলতে পারে যা বৈশিষ্ট্যের সাথে ডেটা কাঠামোটিও প্রদর্শন করে। deম্যাট্রিক্স বা ডেটা ফ্রেম সংশোধন করতে এবং নতুনটি ফিরিয়ে দিতে ফাংশনটি সম্পাদকের মতো এক্সেল খোলার জন্য (যদি জিইউআই এটি সমর্থন করে) ব্যবহার করতে পারে supports এটি কখনও কখনও সুবিধাজনক হয় তবে সাধারণ ক্ষেত্রে এড়ানো উচিত, বিশেষত যখন আপনি ম্যাট্রিক্স বড় হন।


3
এই পদ্ধতির ফলে একই ফাংশন উত্সটি উপস্থিত হয় যা ফাংশনটি মুদ্রণ করে (যা প্রশ্নের মধ্যে একই)। তার থেকে আরও গভীর / গভীরতর হওয়া এই প্রশ্নটি সম্পর্কে।
ব্রায়ান ডিগস

2
@ ব্রায়ানডিগস হ্যাঁ, আপনি ঠিক বলেছেন। আমি প্রশ্নের উত্তর দেওয়ার অর্থ চাইনি, যেহেতু জোশুয়া যথেষ্ট সম্পূর্ণ উত্তর দিয়েছেন। আমি কেবল বিষয় সম্পর্কিত, আকর্ষণীয় কিছু যুক্ত করার চেষ্টা করি এবং এটি সম্পর্কে জানতে দরকারী হতে পারে।
এরিক

8

যতক্ষণ না ফাংশনটি সি / সি ++ / ফোর্টরান না খাঁটি আরে লেখা থাকে ততক্ষণ কেউ নিম্নলিখিতটি ব্যবহার করতে পারেন। অন্যথায় সর্বোত্তম উপায় হ'ল ডিবাগিং এবং " জাম্প ইন " ব্যবহার :

> functionBody(functionName)

2
এই হিসাবে একই bodyidentical(functionBody, body)হয় TRUE
জোশুয়া উলরিচ

1
base::bodyএবং methods::functionBody, যদিও তারা ডিলেট করা পছন্দ করে না। bodyএছাড়াও ওভাররাইড করা যেতে পারে: rdocamentation.org/search?q=body
মুডি_ মুডস্কিপার

7

আরস্টুডিওতে, (অন্তত) 3 টি উপায় রয়েছে:

  1. কার্সারটি যে কোনও কার্যক্রমে থাকাকালীন F2 কী টিপুন।
  2. সিটিটিএল বা কমান্ড ধারণ করার সময় ফাংশনের নামটিতে ক্লিক করুন
  3. View(ফাংশন_নাম) (উপরে বর্ণিত হিসাবে)

সোর্স কোড সহ একটি নতুন ফলক খুলবে। আপনি যদি পৌঁছে যান .প্রিমেটিভ বা। সি। আপনার অন্য পদ্ধতি প্রয়োজন, দুঃখিত।


5

View([function_name])- যেমন View(mean)বড় হাতের [V] ব্যবহার নিশ্চিত করুন। পঠনযোগ্য কোডটি সম্পাদকটিতে খোলা হবে।


5

print.function()কনসোলে ফাংশনটি লেখার জন্য আপনি S3 জেনেরিক যা ব্যবহার করার চেষ্টা করতে পারেন ।


3
print.function()একটি এস 3 পদ্ধতি । জেনেরিক হয় print()। এবং সাধারণত পদ্ধতিগুলি সরাসরি কল করা ভাল ধারণা নয়। এটি জেনেরিক ফাংশন এবং পদ্ধতি প্রেরণের পুরো উদ্দেশ্যকে পরাস্ত করে।
জোশুয়া উলিরিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.