Language detail: R
|
number of '+' ratings |
contribution for coverage |
Unsolved challenges
- 2^i * 3^j * 5^k なる整数 (Nested Flatten)
- 起動オプションの解析 (Nested Flatten)
- マルバツゲーム:賢いプレイヤー (Nested Flatten)
- メソッドのフック (Nested Flatten)
- ポリゴンを表示するプログラム (Nested Flatten)
codes
統計処理言語だけあって、Rでは、この手のデータ処理は非常に直感的です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # タブ区切りのデータを読み込む
d <- read.delim("input.tsv")
# 第1カラムの値でデータを昇順にソートする。
d <- d[sort.list(d[,1]),]
# 第2カラムと第3カラムをヘッダを含めて入れ替える。
d[,c(2,3)] <- d[,c(3,2)]
colnames(d)[c(2,3)] <- colnames(d)[c(3,2)]
# 第4カラムの値にそれぞれ1を加える。
d[,4] <- d[,4] + 1
# 書き出す
write.table(d, "output.tsv", sep="\t", quote=F, row.names=F)
|
Pure Rには心引かれたのですが、POST先URLの扱いが簡単なRCurlを使いました。
1 2 3 4 5 6 | library(RCurl)
print(postForm("http://ll.jus.or.jp/2008/blog/archives/38/trackback",
title = "LL Golf Hole 9 - トラックバックを打つ",
excerpt = "ニコニコ動画で拝見しました。あらためて解説付きで紹介されると面白いですね。自分のコードが紹介されててビックリしました。",
url = "http://ja.doukaku.org/207/",
blog_name = "どう書く?org"))
|
フォーマットが任意だと楽ちんでいいですね。
> DateEx("2008-09-02 00:00:00 JST", 30)
[1] "2008-09-02 00:00:30 JST"
> DateEx("2008-09-02 00:00:00 JST", -30)
[1] "2008-09-01 23:59:30 JST"
1 2 3 | DateEx <- function(d1=Sys.time(), d2=0){
as.POSIXct(d1) + d2
}
|
正攻法で文字列処理をすると長くなってしまうので、
少し変則的に文字列処理をしない方向で書いてみました。
1 2 | n <- 4+1
l=rep("*",n^2);l[cumsum(n-abs(-n:n))]="\n";cat(l)
|
R的にはループを使わない方向で。
1 2 3 4 5 6 | bytes.pretty <- function(n){
u <- c('', 'k', 'M', 'G', 'T')
r <- 1024^(1:length(u)-1)
i <- which.min(abs(512-n/r))
sprintf("%.1f%s", n/r[i], u[i])
}
|
出力フォーマットにこだわらなければintToBts()だけで変換可能です。
1 | d2b <- function(n) paste(as.integer(rev(intToBits(n:n))), collapse="")
|
ループより再帰の方がきれいに書けるかも?と思ったので試してみました。
もう少しうまく書けそうですが・・・
1 2 3 4 | count <- function(n=300){
if(n!=0) Recall(n - 10^(nchar(n-1)-1))
print(n)
}
|
たしかに、数値しか入力されないから"."で十分なのですね。シンプルすぎる・・・
1 | grep("^.0*$",0:300)-1
|
grepが一番シンプルかもですね。
1 | count <- function(n) grep("^[0-9]0*$", 0:n, value=T)
|
substitute()を使って、Rのparserにお任せします。
お題の「一番外側の変数」というのは、「スコープ内の変数」という解釈でいいのでしょうか。例えば以下のようなコードでは、xの最終的な値は10になるので、スコープをさしているのであれば「一番外側」にこだわる必要はないと判断しました。
例では、変数"x"を"aaaa"に変更しています。リストの項目名である"x"や文字列中の"x"、別の変数名の一部に含まれる"x"など、置換するべきでないものは残されているようです。:
> alpha.replace("x", "aaaa")
(入力)
x <- 1
y <- list(x=10)
z <- "w x y z"
xyz <- 1
zzz <- {
x <- 10
}
x
(出力)
{
aaaa <- 1
y <- list(x = 10)
z <- "w x y z"
xyz <- 1
zzz <- {
aaaa <- 10
}
aaaa
}
1 2 3 4 | alpha.replace <- function(from, to){
script <- c("substitute({",readLines(),"}, list(",from,"=quote(",to,")))")
eval(parse(text=script))
}
|
こんな感じでしょうか。
1 2 3 4 5 6 7 8 9 | echo.client <- function(host.name="localhost", port.number=9999){
sock <- socketConnection(host=host.name, port=port.number)
repeat{
writeLines(readLines(), sock)
writeLines(readLines(sock, n=1))
}
}
argv <- commandArgs(trailingOnly=T)
echo.client(argv[1], argv[2])
|
いまさらですが、お題の「画面中央に」を満たしていなかったので直しました。
1 2 3 4 5 6 7 8 9 | library(tcltk)
w <- 100
h <- 75
tt <- tktoplevel(width=w, height=h)
g <- paste("+", c(round((as.integer(tkwinfo("screenwidth", tt)) - w)/2),
round((as.integer(tkwinfo("screenheight", tt)) - h)/2)),
sep="", collapse="")
tkwm.geometry(tt, g)
tkwm.title(tt, "こんにちは、GUI!")
|
R的にはちょっと難しいお題ですね。
キーイベントを取得するにはgetGraphicsEvent()という関数がありますが、実行中はR本体の処理がブロックされてしまって、肝心の"a"を出す処理が実行できないようです。
代わりにR TclTkを使うことにしました。相変わらずWindowsのRguiはコンソール入出力がよろしくないので、Rtermから実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | library(tcltk)
tt <- tktoplevel()
pause.flag <- FALSE
quit.flag <- FALSE
tkbind(tt, "<Key>", function(K){
switch(K,
q = {quit.flag <<- TRUE; },
p = {pause.flag <<- !pause.flag}
)})
repeat{
if(!pause.flag){
writeLines("a")
}
if(quit.flag){
tkdestroy(tt)
quit(save="no")
}
Sys.sleep(1)
}
|
タイムアウトはtimeoutというオプション、プロキシサーバーはhttp_proxyという環境変数でそれぞれ指定します。
http_proxyは、起動後初回のダウンロード処理を実行する前に、一度だけ設定可能です。その後は設定可・不可の切り替えはできますが、プロキシサーバーのホストを変更することはできません(These environment variables must be set before the download code is first used: they cannot be altered later by calling Sys.setenv)。
タイムアウトを1秒にすると、大抵のGETは失敗してしまうみたいですね。
1 2 3 4 5 | http.get <- function(url, proxy='', timeout.value=1){
options(timeout=timeout.value)
Sys.setenv(http_proxy=proxy)
readLines(url)
}
|
Dateクラスをそのまま使うというのは思いつきませんでした。コロンブスの卵すぎる・・・!
一応正攻法も載せておきますね。
1 2 3 4 5 6 7 | is.leap.year1 <- function(y){
!is.na(ISOdate(y,2,29))
}
is.leap.year2 <- function(y){
y %in% union(setdiff(seq(0,y,4), seq(0,y,100)), seq(0,y,400))
}
|
ちょっと短くしました。
1 2 | f <- 'http://www.gnu.org/licenses/gpl.txt'
sapply(unique(unlist(strsplit((l<-readLines(f)),"\\W+"))),grep,l)
|
コード内にURLが出るかでないかで長さがだいぶ違ってくるのでは・・・。
とりあえず普通に。
1 2 | f <- 'http://www.gnu.org/licenses/gpl.txt'
sapply(names(table(unlist(strsplit((l<-readLines(f)),"\\W+")))), function(s) grep(s,l))
|
短くしてみました。
1 | l=Sys.Date():16070;class(l)="Date";length(print(l[format(l,"%d%w")==135]))
|
2013年と都合よく解釈しました。
私にはこのくらいが限度のようです。
1 | with(as.POSIXlt(l<-(seq(Sys.Date(),as.Date("2013-12-31"),"d"))), length(print(l[mday==13 & wday==5])))
|




kkobayashi
#7771()
[
R
]
Rating0/0=0.00
Rにはpiという組み込み変数がありますが、計算であればRらしくモンテカルロで。
pi.montecarlo <- function(n){ mean(replicate(n, sum(runif(2)^2) < 1)) * 4 }Rating0/0=0.00-0+
[ reply ]