Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード

2018-04-10

glue::glue()をちょっと便利に使う

| 23:02 | glue::glue()をちょっと便利に使う - My Life as a Mock Quant を含むブックマーク

glueパッケージのglue()は、いわばPythonでいう .format() を使えるようにするパッケージなわけで、以下のようにテンプレート文字列 (ここでは"a is {a}" )を、その”傍にある”*1 変数で勝手に埋めてくれるので便利に使えるわけです。

> a <- 123
> glue::glue("a is {a}")
a is 123

このテンプレート文字列に指定する変数関数引数になっててもよくて、以下のように使うこともできるのです、おお便利だ!

> f <- function(x)
+ {
+   hoge <- "aaa"
+   glue::glue("{hoge} + {x}")
+ }
> f(123)
aaa + 123

しかし、3連ドット(...)を引数にした場合、その中に所望の変数(ここではx)が入っていたとしても、うまく動きません。

> f <- function(...)
+ {
+   hoge <- "aaa"
+   glue::glue("{hoge} + {x}")
+ }
> f(x=23, y=32)
 Show Traceback
 
 Rerun with Debug
 Error in eval(parse(text = code, keep.source = FALSE), envir) : 
  object 'x' not found 

これを動かすには面倒ですが、

> f <- function(...)
+ {
+   args <- list(...)
+   for(name in names(args)){
+     assign(name, args[[name]])
+   }
+   hoge <- "aaa"
+   glue::glue("{hoge} + {x}")
+ }
> f(x=23, y=32)
aaa + 23

のように、一度3連ドット(...)が絡んでる変数を一度 "f()の環境の変数"としてassignしておく必要があります。

いやいや、これでうごいためでたい。

これを自動でやるようなPull Requestの1つでも出しましょうかねぇ。

*1:実際には (glue::glueの中から見た)parent.frame() = glueの呼び出しもとの環境

AtsushiAtsushi 2018/04/14 16:59 #glue_dataで幸せになれます

f <- function(...) {
hoge <- "aaa"
glue_data(list(...), "{hoge} + {x}")
}
f(x = 23, y = 32)

2018-03-30

purrr::map_dfr = lapply + dplyr::bind_rows

| 22:54 | purrr::map_dfr = lapply + dplyr::bind_rows - My Life as a Mock Quant を含むブックマーク

そういうことなんだよな〜シミュレーション系でよく使うのでメモ。

> dplyr::bind_rows(lapply(1:3, function(x){head(iris, 1)}))
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          5.1         3.5          1.4         0.2  setosa
3          5.1         3.5          1.4         0.2  setosa
> purrr::map_dfr(1:3, ~ head(iris, 1))
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          5.1         3.5          1.4         0.2  setosa
3          5.1         3.5          1.4         0.2  setosa

2018-02-17

R MarkdownでTwo Column(2列)なレポートを作りたい

| 23:04 | R MarkdownでTwo Column(2列)なレポートを作りたい - My Life as a Mock Quant を含むブックマーク

将来的にオレオレJulia v.s. Rチートシートを作るための礎。

主にこちらのStackoverflowを見て適当にCSSコピペった。

以下のMarkdownが

f:id:teramonagi:20180217230450p:image:w360

のような形でHTMLになる。

この左右どちらかをJuliaのengineに帰ればHTML版のチートシートは作れるぞと。


---
title: "Two column R markdown"
author: "Nagi Teramo"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

<style>
.column-left{
  float: left;
  width: 47.5%;
  text-align: left;
}
.column-right{
  float: right;
  width: 47.5%;
  text-align: left;
}
</style>


<div class="column-left">
## Left hand side
```{r}
print("Hello, left side")
```
</div>
<div class="column-right">
## Right hand side
```{r}
print("Hello, right side")
```
</div>

2018-01-23

paste0()を捨てたい

| 22:13 | paste0()を捨てたい - My Life as a Mock Quant を含むブックマーク

文字列を結合するときに使う paste0()を捨てたくて、

`%+%` <- function(x, y){paste0(x, y)}

を定義してみた。

こんな感じで使う。

> "hoge" %+% "moge"
[1] "hogemoge"

うれしい・・・かな?

tidyverseあたりに出てきてもよさそうな機能なんだが、出てきたという話を聞いたことがないな。

2018-01-07

bitFlyer LightningのAPIをRから使う

| 17:45 | bitFlyer LightningのAPIをRから使う - My Life as a Mock Quant を含むブックマーク

"何でもRでやるおじさん日本代表(タヒチ在住)"として、いい加減書いておかねばならないと思った。

まずは、APIキーを頑張って以下から取得してください。

そして、その情報とbitFlyerのURLをなんでもいいんだけど適当な変数に入れておく。

BITFLYER_KEY <- "<your key>"
BITFLYER_SECRET <- "<your secret>"
BITFLYER_URL <- "https://api.bitflyer.jp"

で、早速データを取得する。

まず、PublicのAPIの場合だが、この場合、APIキーの情報はいらない。

例えばBitcoinの板情報はこんな感じで取得+Rっぽく処理しておくといいだろう。

必要になるhttr, dplyr, purrrパッケージは適当にインストールしておいてください。

> content <- httr::content(httr::GET(paste0(BITFLYER_URL, "/v1/board")))
> dfl <- purrr::map(content[-1], ~ dplyr::bind_rows(.x))
> dfl
$bids
# A tibble: 3,387 x 2
     price   size
     <dbl>  <dbl>
 1 1974375 0.0060
 2 1974370 1.0013
 3 1974020 0.3000
 4 1974000 0.1090
 5 1973982 0.0010
 6 1973981 0.0010
 7 1973825 1.5000
 8 1973557 0.0020
 9 1973100 0.0100
10 1973010 0.2000
# ... with 3,377 more rows

$asks
# A tibble: 1,686 x 2
     price      size
     <dbl>     <dbl>
 1 1975486 0.0090000
 2 1975490 0.2390648
 3 1975491 1.4850191
 4 1976989 0.0010000
 5 1977000 1.0549186
 6 1977003 0.3000000
 7 1977781 2.0000000
 8 1978000 0.1999200
 9 1978100 0.6500000
10 1978117 1.1134800
# ... with 1,676 more rows

ちょっと面倒なのはPrivate APIで、これは公式ドキュメントに以下のようにせにゃならんと書いてある

公式サンプルがNode.jsだったので、これをRで書き直した。

以下の例だと自分の口座情報が取得できます。

digestパッケージはまた別途入れておいてください。

# APIのパス
path <- "/v1/me/getbalance"
# unix time stamp
timestamp <- as.numeric(Sys.time())
# 作れと言われてるSign
sign <- digest::hmac(paste0(timestamp, "GET", path), key=BITFLYER_SECRET, algo="sha256", serialize=FALSE)
# ヘッダーに突っ込んでおくる
header <- httr::add_headers(
  `ACCESS-KEY`=BITFLYER_KEY,
  `ACCESS-TIMESTAMP`=timestamp,
  `ACCESS-SIGN`=sign,
  `Content-Type`="application/json"
)
httr::content(httr::GET(paste0(BITFLYER_URL, path), header))

次は発注すっか。