সবচেয়ে কার্যকর আর ট্রিকটি কী? [বন্ধ]


88

আরো কিছু টিপস এবং জন্য ঠাট ভাগ করার জন্য আর , আপনার একক সবচেয়ে দরকারী বৈশিষ্ট্য বা কৌতুক কি? চতুর ভেক্টরাইজেশন? ডাটা ইনপুট / আউটপুট? ভিজ্যুয়ালাইজেশন এবং গ্রাফিক্স? পরিসংখ্যান সংক্রান্ত বিশ্লেষণ? বিশেষ কাজ? ইন্টারেক্টিভ পরিবেশ নিজেই?

প্রতি পোস্টে একটি আইটেম, এবং আমরা ভোটের মাধ্যমে বিজয়ী পাই কিনা তা আমরা দেখতে পাব।

[25-অগস্ট 2008 সম্পাদনা করুন]: সুতরাং এক সপ্তাহ পরে, মনে হচ্ছে str()সরলরা জরিপে জিতেছে। যেহেতু আমি নিজেই এটির প্রস্তাব দিতে চাই, এটি গ্রহণ করা একটি সহজ উত্তর।


8
@ ডার্ক: "সম্প্রদায় উইকি" এর অর্থ "সম্প্রদায়-মালিকানাধীন", এটি "পোল প্রশ্ন" এর প্রতিশব্দ নয়। সম্প্রদায় উইকি পুলিশ শুনবেন না।
জুলিয়েট


8
সিডাব্লু আবারও হুমকি দেয়। : আমি আপনার মেটা-তাই আপনাকে দেখতে ও বাড়াতে করব meta.stackexchange.com/questions/392/...
Ars

13
@ ইয়ার্স: এটি এমন একটি প্রশ্ন যার একটি নির্দিষ্ট উত্তর নেই । এর্গো এটি সিডব্লিউ করুন।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

4
@ জেডি দীর্ঘ হাস্যকর মন্তব্য। দুর্ভাগ্যক্রমে এটি ভাঁজ পিছনে লুকানো ছিল। আমি বোঝাতে চাইছি শক্ত আর প্রশ্নের উত্তর দেওয়া সত্যিই স্ট্যাক-রেপ অনুযায়ী পরিশোধ করে না। সুতরাং এটি আমার কাছে ঠিক আছে যদি ছেলেরা মানচিত্রে আর লাগিয়ে দেয় এমন চমৎকার প্রশ্নগুলি স্থির করে কিছু ক্রেডিট পান তবে। এ ছাড়া আর ব্যবহারকারীরা আপনার প্রিয় সি ট্রিক প্রশ্নটি সি প্রোগ্রামারদের কাছে যা চেয়েছেন তার চেয়ে অবশ্যই বেশি দরকারী ...
ম্যাট ব্যানার্ট

উত্তর:


64

str() আপনাকে যে কোনও বস্তুর গঠন বলে দেয় tells


পাইথন ব্যবহার করে dir()- আরও বোধগম্য করে।
হামিশ গ্রুবিজন

17
আহ, অনেক ভাষায় strসংক্ষিপ্তও string
হামিশ গ্রুবিজান

কেন হবে না class()? এটি একই ধরণের তথ্য প্রকাশ করে বলে মনে হচ্ছে। কেন এই জাতীয় দুটি আদেশ আছে?
এইচএইচ

4
class()শুধু তথ্য একটি ছোট অংশ যে str()প্রদর্শন
হ্যাডলি

64

একটি খুব দরকারী ফাংশন যা আমি প্রায়শই ব্যবহার করি তা হ'ল ডুপুট (), যা আপনাকে কোনও কোডকে আর কোড আকারে ডাম্প করার অনুমতি দেয়।

# Use the iris data set
R> data(iris)
# dput of a numeric vector
R> dput(iris$Petal.Length)
c(1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 
1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1, 1.7, 1.9, 
1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 
1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 4.7, 
4.5, 4.9, 4, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4, 4.7, 
3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4, 4.9, 4.7, 4.3, 4.4, 4.8, 
5, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4, 
4.4, 4.6, 4, 3.3, 4.2, 4.2, 4.2, 4.3, 3, 4.1, 6, 5.1, 5.9, 5.6, 
5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 5.3, 5.5, 5, 5.1, 5.3, 5.5, 
6.7, 6.9, 5, 5.7, 4.9, 6.7, 4.9, 5.7, 6, 4.8, 4.9, 5.6, 5.8, 
6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 
5.9, 5.7, 5.2, 5, 5.2, 5.4, 5.1)
# dput of a factor levels
R> dput(levels(iris$Species))
c("setosa", "versicolor", "virginica")

আপনি সাহায্যের জন্য জিজ্ঞাসা করার সময়, বা কোনও ফ্যাক্টরের স্তরগুলি সম্পাদনা বা পুনঃক্রম করতে সহজেই পুনরুত্পাদনযোগ্য ডেটা অংশগুলি পোস্ট করা খুব দরকারী very


42

ডেটাফ্রেম, ভেক্টর, ম্যাট্রিক্স, ফাংশন ইত্যাদির প্রথম এবং শেষ অংশগুলি পেতে হেড () এবং লেজ () টি বিশেষত বড় ডেটা ফ্রেমের সাহায্যে এটি ঠিক আছে কিনা তা পরীক্ষা করার একটি দ্রুত উপায়।


38

একটি দুর্দান্ত বৈশিষ্ট্য: ডেটা পড়াতে সংযোগগুলি ব্যবহার করা হয় যা স্থানীয় ফাইল হতে পারে, HTTP এর মাধ্যমে দূরবর্তী ফাইল অ্যাক্সেস করতে পারে, অন্যান্য প্রোগ্রামগুলি থেকে পাইপ বা আরও অনেক কিছু হতে পারে।

একটি সাধারণ উদাহরণ হিসাবে, এলোমেলোভাবে এন = 10 এলোমেলো পূর্ণসংখ্যার জন্য কম্বল = 100 এবং সর্বোচ্চ = 200 এর মধ্যে র্যান্ডম.অর্গ থেকে (যা ছদ্ম র্যান্ডম সংখ্যার জেনারেটরের পরিবর্তে বায়ুমণ্ডলীয় গোলমালের উপর ভিত্তি করে সত্য র্যান্ডম সংখ্যা সরবরাহ করে):

R> site <- "http://random.org/integers/"         # base URL
R> query <- "num=10&min=100&max=200&col=2&base=10&format=plain&rnd=new"
R> txt <- paste(site, query, sep="?")            # concat url and query string
R> nums <- read.table(file=txt)                  # and read the data
R> nums                                          # and show it
   V1  V2
1 165 143
2 107 118
3 103 132
4 191 100
5 138 185
R>

একদিকে যেমন, এলোমেলো প্যাকেজটি random.org অ্যাক্সেসের জন্য বেশ কয়েকটি সুবিধাজনক ফাংশন সরবরাহ করে


BTW-- আমি প্রস্তাব করব যে আপনার উচিত selfanswers হিসাবে The CW করতে যদি (1) আপনি তাদের অবিলম্বে পোষ্ট এবং (2) আপনি প্রশ্ন হিসাবে The CW না। অন্যথায় এটি কিছুটা মনে হচ্ছে আপনি রেপ সিস্টেমটি গেম করার চেষ্টা করছেন। ওয়াইএমএমভি এবং সমস্ত কিছু।
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

4
এটি সিস্টেম গেমিং নয়, কেবল জিনিস শুরু করা। তিনি এখনও অন্য কোনও উত্তর মেনে নিতে মুক্ত।
আর্স

4
@ ইয়ার্স: তিনি এটিকে মেনে নিতে মুক্ত। তিনি যদি জিতে থাকেন তবে আমি তাকে জোর করে উইকির উপর চাপানোর চেষ্টা করব না; আমার পরামর্শ না নিলে। তবে আমি এটির উইকি চিহ্নিত না করে একটি প্রস্তুত স্বাবলম্বীর পোস্ট করব না এবং এটি ছাড়া আমিও কোনওকেই ভোট দেব না। এটি মূল্যবান জন্য এটি গ্রহণ করুন।
ডিএমকেকে --- প্রাক্তন মডারেটর বিড়ালছানা

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

8
আমাকে একমত হতে হবে যে সাইটের উদ্দেশ্যগুলির একটি অংশ হ'ল সাধারণ সমস্যাগুলির জন্য সর্বোত্তম উত্তর প্রদান এবং একটি সাধারণ সংস্থান। একটি প্রশ্ন উত্থাপন এবং একটি ভাল উত্তর প্রদান একটি বিষয় উত্সাহিত করতে সাহায্য করতে পারে। এটি নতুন / ছোট ট্যাগগুলির সাথে বিশেষত দরকারী যেমন আর।
কেপিয়ার্স 8

35

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

> df <- data.frame(A = runif(10), B = rnorm(10))
> A <- 1:10 ## something else hanging around...
> with(df, A + B) ## I know this will use A in df!
 [1]  0.04334784 -0.40444686  1.99368816  0.13871605 -1.17734837
 [6]  0.42473812  2.33014226  1.61690799  1.41901860  0.8699079

with()একটি পরিবেশ সেট করে যার মধ্যে আর এক্সপ্রেশন মূল্যায়ন করা হয়। within()একই জিনিসটি করে তবে আপনাকে পরিবেশ তৈরিতে ব্যবহৃত ডেটা অবজেক্টটি পরিবর্তন করতে দেয়।

> df <- within(df, C <- rpois(10, lambda = 2))
> head(df)
           A          B C
1 0.62635571 -0.5830079 1
2 0.04810539 -0.4525522 1
3 0.39706979  1.5966184 3
4 0.95802501 -0.8193090 2
5 0.76772541 -1.9450738 2
6 0.21335006  0.2113881 4

কিছু যখন আমি প্রথম ব্যবহৃত আমি বুঝতে পারছি না within()আপনি অভিব্যক্তি মূল্যায়ন অংশ হিসেবে একটি কাজ যা করতে হবে যে এবং ফিরে বস্তুর বরাদ্দ (উপরে হিসাবে) আকাঙ্ক্ষিত ফল পাবেন।


34

ডেটা ইনপুট ট্রিক = আর গুগলডক্স প্যাকেজ

http://www.omegahat.org/RGoogleDocs/

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

# Get data from google spreadsheet
library(RGoogleDocs)
ps <-readline(prompt="get the password in ")
auth = getGoogleAuth("me@gmail.com", ps, service="wise")
sheets.con <- getGoogleDocsConnection(auth)
ts2=getWorksheets("Data Collection Repos",sheets.con)
names(ts2)
init.consent <-sheetAsMatrix(ts2$Sheet1,header=TRUE, as.data.frame=TRUE, trim=TRUE)

নিম্নলিখিত কমান্ডগুলির মধ্যে একটি বা দু'একটিতে কয়েক সেকেন্ড সময় লাগে বলে আমি পুনরায় স্মরণ করতে পারি না।

  1. গুগলআউথ পান

  2. গুগলডোকস সংযোগ পান

  3. getWorksheets


27

অ-মানক নাম উল্লেখ করতে ব্যাকটিক্স ব্যবহার করুন।

> df <- data.frame(x=rnorm(5),y=runif(5))
> names(df) <- 1:2
> df
           1         2
1 -1.2035003 0.6989573
2 -1.2146266 0.8272276
3  0.3563335 0.0947696
4 -0.4372646 0.9765767
5 -0.9952423 0.6477714
> df$1
Error: unexpected numeric constant in "df$1"
> df$`1`
[1] -1.2035003 -1.2146266  0.3563335 -0.4372646 -0.9952423

এই ক্ষেত্রে, df [, "1"] এছাড়াও কাজ করবে। কিন্তু পিছনে টিক্স সূত্রের ভিতরে কাজ করে!

> lm(`2`~`1`,data=df)

Call:
lm(formula = `2` ~ `1`, data = df)

Coefficients:
(Intercept)          `1`  
     0.4087      -0.3440  

[সম্পাদনা] ডার্ক জিজ্ঞাসা করছেন কেন কেউ অবৈধ নাম দেবে? আমি জানি না! তবে আমি অবশ্যই প্রায়শই অনুশীলনে এই সমস্যাটির মুখোমুখি হই। উদাহরণস্বরূপ, হ্যাডলির পুনরায় আকার প্যাকেজটি ব্যবহার করে:

> library(reshape)
> df$z <- c(1,1,2,2,2)
> recast(df,z~.,id.var="z")
Aggregation requires fun.aggregate: length used as default
  z (all)
1 1     4
2 2     6
> recast(df,z~.,id.var="z")$(all)
Error: unexpected '(' in "recast(df,z~.,id.var="z")$("
> recast(df,z~.,id.var="z")$`(all)`
Aggregation requires fun.aggregate: length used as default
[1] 4 6

ঠিক আছে, তবে কেন আপনাকে ব্যাকটিক্সের প্রয়োজন হিসাবে অবৈধ (যেমন 1 বা 2) এর সাথে সিনট্যাকটিক্যালি বৈধ নামগুলি (x বা y এর মতো) প্রতিস্থাপন করতে হবে?
ডার্ক এডেলবুয়েটেল

4
এছাড়া এ দরকারী read.tableযখন check.namesমিথ্যা - অর্থাৎ যখন আপনি মূল কলাম নামের সাথে কাজ করতে চাই।
হ্যাডলি

25

এটি কতটা সুপরিচিত / না তা জানেন না, তবে এমন কিছু যা আমি অবশ্যই গ্রহণ করেছি পরিবেশের পাস-বাই-রেফারেন্স ক্ষমতা।

zz <- new.env()
zz$foo <- c(1,2,3,4,5)
changer <- function(blah) {
   blah$foo <- 5
}
changer(zz)
zz$foo

এই উদাহরণের জন্য এটি কার্যকর হবে কেন তা বোঝা যায় না, তবে আপনি যদি এর চারপাশে বড় অবজেক্টগুলি পাস করেন তবে এটি সহায়তা করতে পারে।


23

আমার নতুন প্রিয় জিনিসটি হল ফোরচ লাইব্রেরি। এটি আপনাকে সুন্দর প্রয়োগের সমস্ত কিছু করতে দেয় তবে কিছুটা সহজ বাক্য গঠন সহ:

list_powers <- foreach(i = 1:100) %do% {
  lp <- x[i]^i
  return (lp)
}

শ্রেষ্ঠ অংশ যে আপনি যদি এমন কিছু বিষয় যা আসলে সময় একটি উল্লেখযোগ্য পরিমাণ প্রয়োজন করছ, তোমার কাছ থেকে সুইচ করতে পারেন হয় %do%করতে %dopar%(উপযুক্ত ব্যাকএন্ড গ্রন্থাগার সহ) অবিলম্বে parallelize, এমনকি একটি ক্লাস্টার জুড়ে। খুব চতুর।


19

আমি ডেটা প্রচুর বুনিয়াদি হেরফের করি , সুতরাং এখানে দুটি বিল্ট-ইন ফাংশন ( ট্রান্সফর্ম , সাবসেট ) এবং একটি লাইব্রেরি ( স্কুএলডিএফ ) রয়েছে যা আমি প্রতিদিন ব্যবহার করি।

নমুনা বিক্রয় ডেটা তৈরি করুন

sales <- expand.grid(country = c('USA', 'UK', 'FR'),
                     product = c(1, 2, 3))
sales$revenue <- rnorm(dim(sales)[1], mean=100, sd=10)

> sales
  country product   revenue
1     USA       1 108.45965
2      UK       1  97.07981
3      FR       1  99.66225
4     USA       2 100.34754
5      UK       2  87.12262
6      FR       2 112.86084
7     USA       3  95.87880
8      UK       3  96.43581
9      FR       3  94.59259

একটি কলাম যুক্ত করতে রূপান্তর () ব্যবহার করুন

## transform currency to euros
usd2eur <- 1.434
transform(sales, euro = revenue * usd2eur)

>
  country product   revenue     euro
1     USA       1 108.45965 155.5311
2      UK       1  97.07981 139.2125
3      FR       1  99.66225 142.9157
...

ডেটা স্লাইস করতে সাবসেট () ব্যবহার করুন

subset(sales, 
       country == 'USA' & product %in% c(1, 2), 
       select = c('product', 'revenue'))

>
  product  revenue
1       1 108.4597
4       2 100.3475

এসকিউএল সহ স্লাইস এবং সমষ্টি করতে sqldf () ব্যবহার করুন

Sqldf প্যাকেজ আর ডেটা ফ্রেম থেকে একটি SQL ইন্টারফেস প্রদান

##  recast the previous subset() expression in SQL
sqldf('SELECT product, revenue FROM sales \
       WHERE country = "USA" \
       AND product IN (1,2)')

>
  product  revenue
1       1 108.4597
2       2 100.3475

একটি সমষ্টি বা গ্রুপ দ্বারা সম্পাদন করুন

sqldf('select country, sum(revenue) revenue \ 
       FROM sales \
       GROUP BY country')

>
  country  revenue
1      FR 307.1157
2      UK 280.6382
3     USA 304.6860

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


18
?ave

'X []' এর সাবসেটগুলি গড় গড়ে গড়ে নেওয়া হয়, যেখানে প্রতিটি উপসেট একই ফ্যাক্টর স্তরের সাথে থাকা পর্যবেক্ষণগুলি নিয়ে গঠিত। ব্যবহার: ave (এক্স, ..., মজা = গড়)

আমি সব সময় এটি ব্যবহার। (যেমন এখানে এই উত্তরে )


এটি টেপলি (এক্স, ফ্যাক্টর, মজা) থেকে কীভাবে আলাদা?
টিএমএস

4
@ টমাস এভে অর্ডার এবং দৈর্ঘ্য সংরক্ষণ করে। সুতরাং আপনি উদাহরণস্বরূপ, এক ধাপে একটি ডেটাसेटে গোষ্ঠীর একটি ভেক্টর যুক্ত করতে পারেন।
এডুয়ার্ডো লিওনি

18

কোডগুলির গতি বাড়ানোর এবং লুপগুলির জন্য নির্মূল করার একটি উপায়।

লুপগুলির পরিবর্তে মানগুলির সন্ধানকারী কোনও ডেটা ফ্রেমের মধ্য দিয়ে লুপ হয়। খুব দ্রুত, এই মানগুলির সাথে ডিএফের একটি উপসেট গ্রহণ করুন।

সুতরাং পরিবর্তে:

for(i in 1:nrow(df)){
  if (df$column[i] == x) {
    df$column2[i] <- y
    or any other similiar code
  }
}

এরকম কিছু করুন:

df$column2[df$column1 == x] <- y

এই বেস ধারণাটি প্রায়শই প্রযোজ্য এবং লুপগুলি থেকে মুক্তি পাওয়ার এক দুর্দান্ত উপায়


11
এখানে একটি ছোট ফাঁদ আছে যা আমাকে সব সময় ধরে রাখত। যদি ডিএফ $ কলাম 1 এ এনএ মান থাকে তবে == ব্যবহার করে সাবসেট করা x এবং যে কোনও এনএ সমান কোনও মান টেনে আনবে। এড়াতে, "==" পরিবর্তে "%%" ব্যবহার করুন।
ম্যাট পার্কার 15 ই

ম্যাট আপনি একেবারে সঠিক এবং এটি এমন কিছু যা আমি ঘৃণা করি, যদিও আপনার পদ্ধতিটি আমি পছন্দ করি। আমি সাধারণত এনএর জন্য কলামটি পরীক্ষা করি এবং তারপরে আমি তৈরি করা একটি দ্রুত ফাংশন দিয়ে এগুলি সরিয়ে ফেলি যা ডেটাফ্রেম কলাম নেয় এবং ঠিক সেই কলামে এনএ সহ ডেটাফ্রেম বিয়োগ সারিগুলি দেয় returns
ড্যান

মূলত, আমি কলামগুলিতে একটি ডেটাফ্রেম তৈরি করি যার মানগুলি হওয়া দরকার তারপরে সঠিক সারিগুলি পেতে na.omit ব্যবহার করুন এবং তারপরে কেবল সেই সারিগুলির সাহায্যে মূল ডেটাসেটটি সাবসেট করব। শুধু na.omit ব্যবহার করা যেকোন এনএ দিয়ে যে কোনও সারি সরিয়ে ফেলবে, যদিও আমার ভুল হতে পারে।
ড্যান

16

কখনও কখনও আপনার rbindএকাধিক ডেটা ফ্রেম দরকার। do.call()আপনাকে তা করতে দেবে (বাঁধাই করার সময় কেউ আমাকে এই ব্যাখ্যা করতে হয়েছিল যখন আমি এই প্রশ্নটি জিজ্ঞাসা করেছি, কারণ এটি স্পষ্টভাবে ব্যবহার হিসাবে দেখা যাচ্ছে না)।

foo <- list()

foo[[1]] <- data.frame(a=1:5, b=11:15)
foo[[2]] <- data.frame(a=101:105, b=111:115)
foo[[3]] <- data.frame(a=200:210, b=300:310)

do.call(rbind, foo)

শুভ কল: আমি দেখতে পেয়েছি যে এটি ব্যবহারের চেয়ে প্রায়শই সহজ unsplit
রিচি কটন

16

আর প্রোগ্রামিং (না ইন্টারেক্টিভ সেশন), আমি ব্যবহার if (bad.condition) stop("message")একটি অনেক । প্রতিটি ফাংশন এর কয়েকটি দিয়ে শুরু হয়, এবং আমি গণনার মাধ্যমে কাজ করার সাথে সাথে এগুলিতেও মরিচ রাখি। আমি অনুমান করি যে আমি assert()সি ব্যবহার করে অভ্যাসে পড়েছি সুবিধাগুলি দ্বিগুণ। প্রথমত, এই চেকগুলি ঠিকানার জায়গায় কার্যকর কোড পাওয়া খুব দ্রুত। দ্বিতীয়ত এবং সম্ভবত আরও গুরুত্বপূর্ণ, আপনি যখন আপনার সম্পাদকের প্রতিটি স্ক্রিনে এই চেকগুলি দেখেন তখন বিদ্যমান কোডের সাথে কাজ করা অনেক সহজ। আপনার অবাক হওয়ার দরকার নেই x>0, বা এমন কোনও মন্তব্যে বিশ্বাস করা উচিত যা এটি হ'ল ... আপনি জানেন , এক নজরে থেকে, এটা হয়।

পুনশ্চ. আমার প্রথম পোস্ট এখানে। ভদ্র হও!


12
কোনও খারাপ অভ্যাস নয়, এবং আর stopfifnot(!bad.condition)আরও একটি উপায় প্রস্তাব করে: যা আরও সংক্ষিপ্ত।
ডার্ক এডেলবুয়েটেল

13

দ্য traceback()ফাংশন একটি আবশ্যক আপনি একটি ত্রুটি কোথাও আছে এবং এটা নির্দ্ধিধায় বুঝতে পারছি না যখন। এটি স্ট্যাকের একটি ট্রেস মুদ্রণ করবে, এটি ডিফল্টরূপে খুব ভার্বোজ নয় বলে খুব সহায়ক।

তারপরে সেটিংস options(error=recover)আপনাকে ত্রুটি বাড়িয়ে ফাংশনে "প্রবেশ" করতে দেয় এবং ঠিক কী ঘটে যায় তা বোঝার চেষ্টা করে এবং মনে হয় যে এটির উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে এবং এটি একটি নিয়ন্ত্রণ করতে পারেbrowser() রাখতে পারেন।

এই তিনটি ফাংশন সত্যই আপনার কোডটি ডিবাগ করতে সহায়তা করতে পারে।


4
options(error=recover)আমার প্রিয় ডিবাগিং পদ্ধতি।
জোশুয়া উলিরিচ

12

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

 > sapply(rnorm(100, 0, 1), round)
  [1]  1  1  0  1  1 -1 -2  0  2  2 -2 -1  0  1 -1  0  1 -1  0 -1  0  0  0  0  0
 [26]  2  0 -1 -2  0  0  1 -1  1  5  1 -1  0  1  1  1  2  0 -1  1 -1  1  0 -1  1
 [51]  2  1  1 -2 -1  0 -1  2 -1  1 -1  1 -1  0 -1 -2  1  1  0 -1 -1  1  1  2  0
 [76]  0  0  0 -2 -1  1  1 -2  1 -1  1  1  1  0  0  0 -1 -3  0 -1  0  0  0  1  1


> sapply(rnorm(100, 0, 1), round(x, 2)) # How can we pass a parameter?
Error in match.fun(FUN) : object 'x' not found


# Wrap your function call in an anonymous function to use parameters
> sapply(rnorm(100, 0, 1), function(x) {round(x, 2)})
  [1] -0.05 -1.74 -0.09 -1.23  0.69 -1.43  0.76  0.55  0.96 -0.47 -0.81 -0.47
 [13]  0.27  0.32  0.47 -1.28 -1.44 -1.93  0.51 -0.82 -0.06 -1.41  1.23 -0.26
 [25]  0.22 -0.04 -2.17  0.60 -0.10 -0.92  0.13  2.62  1.03 -1.33 -1.73 -0.08
 [37]  0.45 -0.93  0.40  0.05  1.09 -1.23 -0.35  0.62  0.01 -1.08  1.70 -1.27
 [49]  0.55  0.60 -1.46  1.08 -1.88 -0.15  0.21  0.06  0.53 -1.16 -2.13 -0.03
 [61]  0.33 -1.07  0.98  0.62 -0.01 -0.53 -1.17 -0.28 -0.95  0.71 -0.58 -0.03
 [73] -1.47 -0.75 -0.54  0.42 -1.63  0.05 -1.90  0.40 -0.01  0.14 -1.58  1.37
 [85] -1.00 -0.90  1.69 -0.11 -2.19 -0.74  1.34 -0.75 -0.51 -0.99 -0.36 -1.63
 [97] -0.98  0.61  1.01  0.55

# Note that anonymous functions aren't being called, but being passed.
> function() {print('hello #rstats')}()
function() {print('hello #rstats')}()
> a = function() {print('hello #rstats')}
> a
function() {print('hello #rstats')}
> a()
[1] "hello #rstats"

(যারা # স্টার্টস অনুসরণ করে তাদের জন্য আমি এটি এখানে পোস্ট করেছি)।

মনে রাখবেন, প্রয়োগ করুন, স্যাপলি, ল্যাপলি, ট্যাপলি এবং ড ক্যাল! আর এর ভেক্টরাইজেশনের সুবিধা নিন। আপনার কখনই আর কোডের একগুচ্ছ পর্যন্ত হাঁটা উচিত নয় এবং দেখুন:

N = 10000
l = numeric()
for (i in seq(1:N)) {
    sim <- rnorm(1, 0, 1)
    l <- rbind(l, sim)
}

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

N=10000
l <- rnorm(N, 0, 1)

নিম্নলিখিতটি প্রথম সংস্করণের চেয়েও ভাল:

N = 10000
l = numeric(N)
for (i in seq(1:N)) {
    sim <- rnorm(1, 0, 1)
    l[i] <- sim
}

প্রয়োগ করুন, স্যাপলি, ল্যাপ্লি এবং টেপলি দরকারী। আপনি যদি রাউন্ডের মতো কোনও নামকৃত ফাংশনে প্যারামিটারগুলি পাস করতে চান তবে আপনি কোনও বেনামে ফাংশন লেখার পরিবর্তে প্রয়োগের পাশাপাশি এটি পাস করতে পারেন। "স্যাপ্লি (rnorm (10, 0, 1), বৃত্তাকার, অঙ্কগুলি = 2)" যা আউটপুট দেয় "[1] -0.29 0.29 1.31 -0.06 -1.90 -0.84 0.21 0.02 0.23 -1.10" চেষ্টা করুন।
ড্যানিয়েল

11

ডার্কের পরামর্শে, আমি একক উদাহরণ পোস্ট করছি। আমি আশা করি তারা খুব "চতুর" নয় [চতুর, তবে আমার কোনও যত্ন নেই] বা এই দর্শকের পক্ষে তুচ্ছ নয়।

লিনিয়ার মডেলগুলি হ'ল আর এর রুটি এবং মাখন independent যখন স্বতন্ত্র ভেরিয়েবলের সংখ্যা বেশি থাকে, তখন একটির দুটি পছন্দ থাকে। প্রথমটি এটির জন্য lm.fit () ব্যবহার করে, যা ম্যাট্লাবের মতো একইভাবে নকশার ম্যাট্রিক্স এক্স এবং প্রতিক্রিয়া y অর্জন করে। এই পদ্ধতির অপূর্ণতা হ'ল প্রত্যাবর্তন মান হ'ল বস্তুগুলির একটি তালিকা (লাগানো সহগ, অবশিষ্টাংশ, ইত্যাদি), শ্রেণি "এলএম" এর কোনও অবজেক্ট নয়, যা সংক্ষিপ্তভাবে সংক্ষিপ্ত করা যায়, পূর্বাভাসের জন্য ব্যবহৃত হয়, পদক্ষেপের নির্বাচন ইত্যাদি। দ্বিতীয় পদ্ধতির একটি সূত্র তৈরি করা হয়:

> A
           X1         X2          X3         X4         y
1  0.96852363 0.33827107 0.261332257 0.62817021 1.6425326
2  0.08012755 0.69159828 0.087994158 0.93780481 0.9801304
3  0.10167545 0.38119304 0.865209832 0.16501662 0.4830873
4  0.06699458 0.41756415 0.258071616 0.34027775 0.7508766
   ...

> (f=paste("y ~",paste(names(A)[1:4],collapse=" + ")))
[1] "y ~ X1 + X2 + X3 + X4"

> lm(formula(f),data=A)

Call:
lm(formula = formula(f), data = A)

Coefficients:
(Intercept)           X1           X2           X3           X4  
    0.78236      0.95406     -0.06738     -0.43686     -0.06644  

আপনি যদি প্রতি পোস্টে একটি বাছাই করেন এবং উদাহরণ দিয়ে চিত্রিত করেন তবে কীভাবে? তারপরে আমরা শেষের দিকে কয়েকদিন ধরে চলতে পারি এবং নতুন কমান্ড সহ নতুন উদাহরণ পোস্ট করতে পারি ... [বিটিডাব্লু: আমার মনে আছে, সূত্র ব্যবহারের জন্য আপনার as.forula (পেস্ট (...)) দরকার need ]
ডার্ক এডেলবুয়েটেল

"Y ~। - 1" রূপটি সমস্ত কলামটি কভার করার জন্য আপনার সুস্পষ্ট সূত্র তৈরির দরকার নেই। দ্য "." মানে 'নির্ভরশীল পরিবর্তনশীল ব্যতীত সমস্ত কলাম এবং' - 1 'ধ্রুবকটিকে আপনার উদাহরণ হিসাবে বাদ দেয়।
ডর্ক এডেলবুয়েটেল

এই নির্দিষ্ট উদাহরণের জন্য এটি সঠিক, তবে এক্স-এর সাথে এনসিওএল >> ন্যারস, আমি প্রায়শই কিছু স্বাধীন ভেরিয়েবল মুছে ফেলি, বিশেষত বিশ্লেষণের শেষ পর্যায়ে। এই ক্ষেত্রে, ডেটা ফ্রেমের নামগুলি থেকে একটি সূত্র তৈরি করা এখনও কার্যকর।
gappy

10

আপনি যদি অন্য কোনও ব্লক থেকে ফেরার মান নির্ধারণ করতে পারেন।

পরিবর্তে, যেমন

condition <- runif(1) > 0.5
if(condition) x <- 1 else x <- 2

আপনি করতে পারেন

x <- if(condition) 1 else 2

ঠিক কীভাবে এটি গভীর যাদুতে কাজ করে।


6
আপনি x <- ifelse (শর্ত, 1, 2) এর মতো এটিও করতে পারেন, যার ক্ষেত্রে প্রতিটি উপাদান ভেক্টরাইজড।
শেন

শেন, আপনি পারতেন, তবে আপনি যদি সত্যিই গভীরভাবে কুঁচকে না যান তবে ইফেলস () কী করে, আপনার সম্ভবত করা উচিত নয়! ভুল বোঝার পক্ষে এটি সহজ ...
হারলান

সে সম্পর্কে যাদু কী? if-then-elseকোনও কার্যকরী ভাষায় এক্সপ্রেশনগুলি ঠিক সেভাবেই কাজ করে ( if-then-else বিবৃতিতে বিভ্রান্ত না হয় )। ?:সি-এর মতো ভাষার টেরিনারি অপারেটরের সাথে খুব মিল similar
ফ্র্যাঙ্ক

10

আমি মোট পছন্দসই পরিসংখ্যানগুলিতে আর-এর মোট নুবি এবং একজন নবজাতক হিসাবে unclass() একটি ডেটা ফ্রেমের সমস্ত উপাদানকে একটি সাধারণ তালিকা হিসাবে মুদ্রণ করতে পছন্দ ।

কোনও সম্ভাব্য সমস্যাগুলিকে দ্রুত চোখের পাতায় যেতে একসাথে একটি সম্পূর্ণ ডেটা সেট করা একবার দেখার জন্য এটি বেশ সহজ।


9

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


সুন্দর !! আমি বেশ খানিকটা গডমেলস ব্যবহার করি, তবে সেটিকে মিস করেছি
অভিজিৎ

উত্তম উত্তর, যে কোনও কিছু যা আমাকে বিধর্মীদের সাথে টেবিলগুলির অত্যধিক ব্যাখ্যা থেকে দূরে রাখতে পারে তা সময়ের সদ্ব্যবহার।
স্টেডি

7

অবশ্যই system()। আর পরিবেশের অভ্যন্তর থেকে সমস্ত ইউনিক্স সরঞ্জাম (কমপক্ষে লিনাক্স / ম্যাকোএসএক্স এর অধীনে) অ্যাক্সেস পেতে সক্ষম হওয়ার জন্য আমার প্রতিদিনের কর্মপ্রবাহে দ্রুত অমূল্য হয়ে উঠেছে।


4
সংযোগগুলি সম্পর্কে এটি আমার আগের মন্তব্যের সাথে জড়িত: আপনি ইউনিক্স কমান্ডগুলি থেকে ডেটা পাস করতে পাইপ () ব্যবহার করতে পারেন। দেখুন help(connections)বিবরণ এবং উদাহরণের জন্য।
ডার্ক এডেলবুয়েটেল

6

একটি ফ্যাক্টরটিকে সংখ্যায় রূপান্তর করতে এখানে বিরক্তিকর কাজ রয়েছে work (অন্যান্য ডেটা ধরণের ক্ষেত্রেও একই রকম)

old.var <- as.numeric(levels(old.var))[as.numeric(old.var)]

4
হতে পারে আপনি "একটি চিত্রকর" ভেক্টর বোঝাতে চেয়েছিলেন meant যে ক্ষেত্রে "as.character (old.var)" সহজ।
ডার্ক এডেলবুয়েটেল

4
আমি সর্বদা ভেবেছিলাম এই পরামর্শটি (যা পড়তে পারেন? ফ্যাক্টর) ভুল পথে চালিত হতে। আপনাকে নিশ্চিত হতে হবে যে পুরানো.ভর একটি ফ্যাক্টর, এবং এটি আর সেশনের জন্য আপনি যে বিকল্পগুলি সেট করেছেন তার উপর নির্ভর করে পৃথক হবে। As.numeric (as.character (old.var)) ব্যবহার করা উভয়ই নিরাপদ এবং ক্লিনার।
এডুয়ার্ডো লিওনি

সত্যিই একটি ডাউনভোট মূল্যবান নয়, তবে যাই হোক না কেন। এটি আমার পক্ষে কাজ করে।
রায়ান আর রোজারিও

রায়ান - আপনি কি আপনার কোড ঠিক করতে পারবেন? যদি old.var <- ফ্যাক্টর (1: 2); আপনার কোডটি [1] "1" "2" দেবে (সংখ্যায় নয়) perhaps সম্ভবত আপনি সংখ্যার (লেভেল (ওল্ড.ভার) [old.var]) হিসাবে বোঝাচ্ছেন?
এডুয়ার্ডো লিওনি

4
বা কিছুটা দক্ষতার সাথে:as.numeric(levels(old.var))[old.var]
হ্যাডলি

6

যদিও এই প্রশ্নটি কিছু সময়ের জন্য দাঁড়িয়েছে আমি কমান্ডটি ব্যবহারের জন্য সম্প্রতি এসএএস এবং আর ব্লগে একটি দুর্দান্ত কৌশল আবিষ্কার করেছি cut। কমান্ডটি ডেটা বিভাগগুলিতে বিভক্ত করতে ব্যবহৃত হয় এবং আমি আইরিস ডেটাसेटকে উদাহরণ হিসাবে ব্যবহার করব এবং এটি 10 ​​বিভাগে ভাগ করব:

> irisSL <- iris$Sepal.Length
> str(irisSL)
 num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
> cut(irisSL, 10)
  [1] (5.02,5.38] (4.66,5.02] (4.66,5.02] (4.3,4.66]  (4.66,5.02] (5.38,5.74] (4.3,4.66]  (4.66,5.02] (4.3,4.66]  (4.66,5.02]
 [11] (5.38,5.74] (4.66,5.02] (4.66,5.02] (4.3,4.66]  (5.74,6.1]  (5.38,5.74] (5.38,5.74] (5.02,5.38] (5.38,5.74] (5.02,5.38]
 [21] (5.38,5.74] (5.02,5.38] (4.3,4.66]  (5.02,5.38] (4.66,5.02] (4.66,5.02] (4.66,5.02] (5.02,5.38] (5.02,5.38] (4.66,5.02]
 [31] (4.66,5.02] (5.38,5.74] (5.02,5.38] (5.38,5.74] (4.66,5.02] (4.66,5.02] (5.38,5.74] (4.66,5.02] (4.3,4.66]  (5.02,5.38]
 [41] (4.66,5.02] (4.3,4.66]  (4.3,4.66]  (4.66,5.02] (5.02,5.38] (4.66,5.02] (5.02,5.38] (4.3,4.66]  (5.02,5.38] (4.66,5.02]
 [51] (6.82,7.18] (6.1,6.46]  (6.82,7.18] (5.38,5.74] (6.46,6.82] (5.38,5.74] (6.1,6.46]  (4.66,5.02] (6.46,6.82] (5.02,5.38]
 [61] (4.66,5.02] (5.74,6.1]  (5.74,6.1]  (5.74,6.1]  (5.38,5.74] (6.46,6.82] (5.38,5.74] (5.74,6.1]  (6.1,6.46]  (5.38,5.74]
 [71] (5.74,6.1]  (5.74,6.1]  (6.1,6.46]  (5.74,6.1]  (6.1,6.46]  (6.46,6.82] (6.46,6.82] (6.46,6.82] (5.74,6.1]  (5.38,5.74]
 [81] (5.38,5.74] (5.38,5.74] (5.74,6.1]  (5.74,6.1]  (5.38,5.74] (5.74,6.1]  (6.46,6.82] (6.1,6.46]  (5.38,5.74] (5.38,5.74]
 [91] (5.38,5.74] (5.74,6.1]  (5.74,6.1]  (4.66,5.02] (5.38,5.74] (5.38,5.74] (5.38,5.74] (6.1,6.46]  (5.02,5.38] (5.38,5.74]
[101] (6.1,6.46]  (5.74,6.1]  (6.82,7.18] (6.1,6.46]  (6.46,6.82] (7.54,7.9]  (4.66,5.02] (7.18,7.54] (6.46,6.82] (7.18,7.54]
[111] (6.46,6.82] (6.1,6.46]  (6.46,6.82] (5.38,5.74] (5.74,6.1]  (6.1,6.46]  (6.46,6.82] (7.54,7.9]  (7.54,7.9]  (5.74,6.1] 
[121] (6.82,7.18] (5.38,5.74] (7.54,7.9]  (6.1,6.46]  (6.46,6.82] (7.18,7.54] (6.1,6.46]  (5.74,6.1]  (6.1,6.46]  (7.18,7.54]
[131] (7.18,7.54] (7.54,7.9]  (6.1,6.46]  (6.1,6.46]  (5.74,6.1]  (7.54,7.9]  (6.1,6.46]  (6.1,6.46]  (5.74,6.1]  (6.82,7.18]
[141] (6.46,6.82] (6.82,7.18] (5.74,6.1]  (6.46,6.82] (6.46,6.82] (6.46,6.82] (6.1,6.46]  (6.46,6.82] (6.1,6.46]  (5.74,6.1] 
10 Levels: (4.3,4.66] (4.66,5.02] (5.02,5.38] (5.38,5.74] (5.74,6.1] (6.1,6.46] (6.46,6.82] (6.82,7.18] ... (7.54,7.9]

5

অন্য কৌশল। কিছু প্যাকেজ, যেমন গ্ল্যামনেট, কেবল ডিজাইন ম্যাট্রিক্স এবং প্রতিক্রিয়া ভেরিয়েবল হিসাবে গ্রহণ করে। যদি কোনও বৈশিষ্ট্যগুলির মধ্যে সমস্ত ইন্টারঅ্যাকশন সহ কোনও মডেল ফিট করতে চায় তবে তিনি "y ~। ^ 2" সূত্রটি ব্যবহার করতে পারবেন না। ব্যবহার করে expand.grid()আমাদের আর এর শক্তিশালী অ্যারে সূচক এবং ভেক্টর অপারেশনগুলির সুবিধা নিতে সহায়তা করে allows

interArray=function(X){
    n=ncol(X)
    ind=expand.grid(1:n,1:n)
    return(X[,ind[,1]]*X[,ind[,2]])
}

> X
          X1         X2
1 0.96852363 0.33827107
2 0.08012755 0.69159828
3 0.10167545 0.38119304
4 0.06699458 0.41756415
5 0.08187816 0.09805104

> interArray(X)
           X1          X2        X1.1        X2.1
1 0.938038022 0.327623524 0.327623524 0.114427316
2 0.006420424 0.055416073 0.055416073 0.478308177
3 0.010337897 0.038757974 0.038757974 0.145308137
4 0.004488274 0.027974536 0.027974536 0.174359821
5 0.006704033 0.008028239 0.008028239 0.009614007

4
যদি কোনও মডেলিং ফাংশন কোনও সূত্র গ্রহণ না করে (যা খুব বিরল!) ডিজাইন ম্যাট্রিক্সটি দিয়ে তৈরি করা ভাল না model.matrix?
হ্যাডলি

সুন্দর. আমি এই ফাংশনটির অস্তিত্ব সম্পর্কে জানতাম না। উপরের ফাংশনটি মডেল.ম্যাট্রিক্সের সমতুল্য (^। ^ 2 -1, এক্স) তবে ম্যাট্রিক পাস করার ক্ষেত্রে, গ্ল্যামনেট বাদে, কাস্টম সি ফাংশনে অ্যারে পয়েন্টারগুলি পাস করা আমার প্রায়শই ঘন ঘন। আসলে, আমি জানতাম না কীভাবে কোনও ফাংশনে কোনও সূত্র পাস করতে হয়। আপনার কি খেলনার উদাহরণ আছে?
gappy

5

আমার প্রিয় এক, যদি কিছুটা অগতানুগতিক না ট্রিকগুলি ব্যবহার eval()এবং parse()। এই উদাহরণটি সম্ভবত ব্যাখ্যা করে যে এটি কীভাবে সহায়ক হতে পারে

NY.Capital <- 'Albany'
state <- 'NY'
parameter <- 'Capital'
eval(parse(text=paste(state, parameter, sep='.')))

[1] "Albany"

এই ধরণের পরিস্থিতি প্রায়শই না ঘটে এবং এর ব্যবহার eval()এবং parse()এটির সমাধানে সহায়তা করতে পারে। অবশ্যই, আমি এটিকে কোডিংয়ের বিকল্প উপায়গুলির বিষয়ে কোনও প্রতিক্রিয়া স্বাগত জানাই।


4
নামযুক্ত ভেক্টর উপাদানগুলির সাথে এটিও করা যেতে পারে।
ডার্ক এডেলবুয়েটেল

4
গ্রন্থাগার (ভাগ্য); ভাগ্য (106) উত্তরটি পার্স করা হলে () আপনার সাধারণত প্রশ্নটি পুনর্বিবেচনা করা উচিত। - টমাস লুমলে আর-সহায়তা (ফেব্রুয়ারী 2005)
এডুয়ার্ডো লিওনি

এখানে উদাহরণ রয়েছে যেখানে eval () এবং পার্স () কার্যকর হতে পারে। এর মধ্যে একটি বায়োকন্ডাক্টর প্যাকেজ জড়িত, যেমন hgu133a.db এবং যেখানে আপনি একটি প্রোবেট আইডি সম্পর্কে বিভিন্ন টুকরো তথ্য পাওয়ার চেষ্টা করছেন। উদাহরণস্বরূপ: লাইব্রেরি (hgu133a.db) প্যারামিটার <- 'SYMBOL' mget ('202431_s_at', env = eval (পার্স (পাঠ্য = পেস্ট ('hgu133a', পরামিতি, sep = '')))) প্যারামিটার <- 'ENTREZID 'এমজেট (' 202431_s_at ', এনভি = ইওল (পার্স (পাঠ্য = পেস্ট (' hgu133a ', পরামিতি, সেপ =' ')))))
অ্যান্ড্রুজ

ডার্ক যেমন বলেছেন, নামযুক্ত ভেক্টর উপাদানগুলির সাথে এটি আরও ভালভাবে করা হয়েছে, বা `get (পেস্ট (রাজ্য, পরামিতি, সেপ = '।'))
had

@ হ্যাডলি, আপনি জানেন না যে আপনি এইভাবে () ব্যবহার করতে পারেন। ধন্যবাদ
অ্যান্ড্রুজ

5

set.seed() এলোমেলো সংখ্যা জেনারেটরের স্থিতি সেট করে।

উদাহরণ স্বরূপ:

> set.seed(123)
> rnorm(1)
[1] -0.5604756
> rnorm(1)
[1] -0.2301775
> set.seed(123)
> rnorm(1)
[1] -0.5604756

র্যান্ডম ফাংশনগুলি ব্যবহার করে এমন উদাহরণগুলির সাথে দুর্দান্ত দরকারী ... প্রত্যেককে একই পৃষ্ঠায় পেতে সহায়তা করে
জেডি লং

5

যারা সি লিখছেন তাদের জন্য আর থেকে কল করা .Internal(inspect(...))খুব সহজ। উদাহরণ স্বরূপ:

> .Internal(inspect(quote(a+2)))
  @867dc28 06 LANGSXP g0c0 [] 
  @8436998 01 SYMSXP g1c0 [MARK,gp=0x4000] "+"
  @85768b0 01 SYMSXP g1c0 [MARK,NAM(2)] "a"
  @8d7bf48 14 REALSXP g0c1 [] (len=1, tl=0) 2

4

d = '~ / আর কোড / গ্রন্থাগার /'

ফাইলগুলি = list.files (d, '। r $')

(ফাইলগুলিতে চ) এর জন্য {if (! (f == 'mysource.r')) {মুদ্রণ (পেস্ট ('সোর্সিং', চ)) উত্স (পেস্ট (d, f, sep = ''))}}

আমি আর এর সাথে আমার ইন্টারেক্টিভ সেশনে বিভিন্ন ইউটিলিটি প্রোগ্রামগুলি ব্যবহার করে একটি ডিরেক্টরিতে সমস্ত ফাইল উত্স করতে উপরের কোডটি ব্যবহার করি I আমি নিশ্চিত যে আরও ভাল উপায় আছে তবে আমি আমার কাজের জন্য এটি দরকারী মনে করি। এই লাইনটি এটি করে is

উত্স ("~ / আর কোড / গ্রন্থাগার / mysource.r")


6
এটা করবেন না। একটি প্যাকেজ লিখুন।
ডার্ক এডেলবুয়েটেল 21

ধন্যবাদ আমি রসুনের উপর একটি থ্রেড দু'এর দিকে চেয়ে দেখছি এবং মনে হয় আমি সম্ভবত এমন স্তরে আছি যেখানে আমার একটি সাধারণ স্ব-ব্যবহারের প্যাকেজ লেখার চেষ্টা করা উচিত।
mcheema

3

একটি ডেটা ফ্রেমে বিভিন্ন ভেরিয়েবলের একটি অপারেশন সম্পাদন করতে। এটি সাবসেট.ডেটা.ফ্রেমে থেকে চুরি হয়েছে।

get.vars<-function(vars,data){
    nl <- as.list(1L:ncol(data))
    names(nl) <- names(data)
    vars <- eval(substitute(vars), nl, parent.frame())
    data[,vars]
    #do stuff here
}

get.vars(c(cyl:hwy,class),mpg)

4
এটি প্রথমে দুর্দান্ত বলে মনে হচ্ছে তবে এই ধরণের কোডটি আপনাকে দীর্ঘমেয়াদে ঝামেলার শেষ করবে না। স্পষ্ট করে বলা ভাল better
হ্যাডলি

হুম, আমি এই ট্রিকটি অনেকটা দেরিতে ব্যবহার করেছি using আপনি কি এটির সীমাহীন ঝামেলা সম্পর্কে আরও নির্দিষ্ট হতে পারেন?
ইয়ান ফেলো

এর পরিবর্তে হ্যাডলি প্লাইর প্যাকেজটি ব্যবহার করার পরামর্শ দিচ্ছেন?
ক্রিস্টোফার ডুবুইস

4
না, এটির পরিবর্তে প্লেয়ার ব্যবহার করার জন্য এটি একটি ঘোমাকানা পরামর্শ নয়। আপনার কোডটির সাথে মূলত সমস্যাটি হ'ল এটি শব্দার্থগতভাবে অলস - ব্যবহারকারী তাদের স্পষ্ট করে কী চান তা বানান করার পরিবর্তে, আপনি অনুমান করার জন্য কিছু "যাদু" করেন। এটির সাথে সমস্যাটি হ'ল এটিটি ফাংশনটি দিয়ে প্রোগ্রাম করা খুব শক্ত করে তোলে - যেমন কোনও ফাংশন লিখতে অসুবিধা হয় যা get.varsপুরো হুপের বাইরে ঝাঁপ না দিয়ে কল করে ।
হ্যাডলি

3

আমি এটি আগে একবার পোস্ট করেছি তবে আমি এটিকে এত বেশি ব্যবহার করেছি আমি ভেবেছিলাম এটি আবার পোস্ট করব। এটি একটি ডেটা.ফ্রেমের নাম এবং অবস্থানের নম্বরগুলি ফিরিয়ে দেওয়ার জন্য কেবল সামান্য ফাংশন। এটি নিশ্চিত হওয়া বিশেষ কিছু নয় তবে আমি এটি প্রায় একাধিকবার ব্যবহার না করে কোনও সেশনের মাধ্যমে প্রায় কখনও তৈরি করি না।

##creates an object from a data.frame listing the column names and location

নেমসিন্ড = ফাংশন (ডিএফ) {

temp1=names(df)
temp2=seq(1,length(temp1))
temp3=data.frame(temp1,temp2)
names(temp3)=c("VAR","COL")
return(temp3)
rm(temp1,temp2,temp3)

}

ni <- নেমসাইন্ড


4
এটি সত্যিই একটি ওয়ান-লাইনার:data.frame(VAR = names(df), COL = seq_along(df))
হ্যাডলি

খুব মার্জিত, সম্ভবত আমি এটিকে <i> ফাংশন (ডিএফ) {ডেটা.ফ্রেমে (ভিআর = নামগুলি (ডিএফ), সিওএল = সেক_আলং (ডিএফ))}
কেপিয়ারস 8

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