暫定的に。GitHub上に書いた方がよいかも知れないけども。
niszet名義で登録しているもののリスト。
ツイッターアカウント。ツイ廃なので最低限RTはミュート推奨
作ったまま放置のますとどんアカウント。
GitHubアカウント。あんまり公開しているリポジトリはない。
YouTubeチャンネル。動画は少ない。
Qiita。記事の投稿はない。
Zenn。こちらも読むだけ。
Twitch。2022年末時点でスプラ3の配信をしたりしなかったり。
このブログは別に注記がない場合、文章、画像、コードについてはクリエイティブ・コモンズ・ライセンス(CC-BY-SA)で公開されています。
明記していなかったので書きました(2021/1/14)
問題はタイトルに書いた通り。具体的にはこういうコードで、ページにtabを入れて切り替えられるようにしたさいに、それぞれ同じsidebarを使いたいということで同じものを指定している。
tabsetPanel( tabPanel(tab_calendar_display, sidebarLayout( sidebarPanel = sidebar1, mainPanel = mainPanel( fluidRow( column( width = 12, calendarOutput("my_calendar") )), ), position="right")), tabPanel(tab_map_display, sidebarLayout( sidebar1, mainPanel( h2("EventMap"), leafletOutput("mymap") ),"right") ), id = "myTabs" )
Shinyでは特に問題なく動作するが、ShinyLiveではエラーとなる(ShinyLiveではエラーがなく表示もされないということが多々あるので、エラーが表示されるだけマシという話はある)
今のところ回避方法は見つかっていないため、同じ構成でも別のsidebarとして作るべきかもしれない。あまり深追いはしていないため、何かわかれば別途投稿します。
動的に扱いたいページを作成したいが、ShinyはShinyServerなどを準備できない、公開等もしたくないようなケースに、生成したleafletの地図にJavaScriptで触りたい場合がある。ほとんどないと思うけど、ある。
普通のやり方では出来ないため(elementIdを指定してもダメだった)、調べたら出てきた。
この記事によれば、leafletのオブジェクトをhtmlwidgets::onRender
に渡して、下記のようにすれば、JavaScript側からはmapとしてアクセス出来るとのこと。
output$map <- renderLeaflet({ leaflet() %>% addProviderTiles("CartoDB.Positron") %>% htmlwidgets::onRender(" function(el,x) { map = this; } ") })
実際、
<script language="javascript" type="text/javascript"> function OnLinkClick() { map.setView([48.45653, 8.90068], 8); return false; } </script> <a href="javascript:OnLinkClick();">ジャンプ</a>
のようなコードで、リンクをクリックするとRのleafletパッケージで生成した地図に対してsetViewが動作することを確認した。あとはこれに引数として座標を与えられれば任意の座標に飛ぶことが出来る。
Shinyアプリを、Shiny Serverなしで動かすことが出来る。そんな素敵な仕組みが開発されています。ShinyLiveという名前で、RやShinyで書かれたコードを変換し、ブラウザ上で動作出来るようにするといったもの(良くわかってませんが…
今、quartoでサイトを作ってるのですが、shiny的な、インタラクティブに扱いたい物があるものの、Shiny Serverもないしなぁといったところで、朗報だったのですが…
こちらは既に解決してcloseされていますが、ShinyLiveが依存しているWebRの状況によって、ShinyLiveやサイト自体に変更がなくても動作しなくなることがあることがわかりました。
このあと、動作はしたものの、翌々日にはまた別の理由で動かなくなってしまい、公開できるような状態に持って行くのはまだ難しいなぁ、というところです。
ただ、色々と使い方はわかってきたので、ぼちぼちこちらのブログの再開とともに、ネタを投下していこうと思います。quartoも、沢山知見は溜まりましたしね。
ということで、やっていきましょう。
Rの最初の最初、ベクトルとはどんなものかみたいな話からはじまって、
seq(1,5) # [1] 1 2 3 4 5
とか、
rep(1,5) # [1] 1 1 1 1 1
とかで、わーい!ってやっていた時期があると思います。で、seq(1,5)
の代わりに1:5
でもいけるよ!すげーじゃん!!
で、じゃあアルファベットも・・・って試して、
"a":"z" # "a":"z" でエラー: 引数が NA/NaN です # 追加情報: 警告メッセージ: # 1: 強制変換により NA が生成されました # 2: 強制変換により NA が生成されました
あると思います。
baseパッケージに、lettersというデータがあるので、これを使います。これが正解。あと、大文字でLETTERS
もある。
letters # [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
全てのアルファベットについてチェックしようとかいう場合は、c(letters,LETTERS)
でつなげればよろしい。
あと余談ですが、:
も関数なので、:
(1,5) で 1:5 と同じ結果になりますし、ベクトルなので、要素をインデックスで指定して
letters[c(1,26,26,1)] # [1] "a" "z" "z" "a"
みたいになりますね。
C言語とかで文字を扱う場合、文字コードがaからzまで連番だから・・・という考え方で、上記のような連番生成できるんじゃないの?みたいな考えになりますよね。
じゃあそれでやってみるか。とはいえ、文字から数字への変換はNAになってしまうし...というところでハマりがちですが、Rにはraw型があります。ただ、文字からrawへの変換はcharToRaw
なので注意が必要ですね。
charToRaw("a") # [1] 61 as.integer(charToRaw("a")) # [1] 97
raw型は出力が16進数であらわされているのに注意です。10進数にするにはas.integer
です。:
はraw型を受け付けてくれないので、このように一旦integerにして、それを使い、raw型に戻し、rawからcharへの変換をかけます。
つまり、以下のようになります。
rawToChar(as.raw(`:`(as.integer(charToRaw("a")),as.integer(charToRaw("z")))), multiple = T) # [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
ここで、rawToChar
に引数multiple = T
を与えないと、文字がすべて結合されてしまうため注意。
一応、一致を確認してみると、
identical(letters, rawToChar(as.raw(`:`(as.integer(charToRaw("a")),as.integer(charToRaw("z")))), T)) # [1] TRUE
となり、ちゃんと生成できましたね。
めでたしめでたし。
Pandocはテンプレートのスタイルなどを使って、生成するファイルの見栄えを制御出来ますが、Pandocがテンプレートとなるファイルからその情報を抜き出すように処理を書いているものだけが対応していて、全ての設定が反映されるわけではありません(が、概ね反映されるはず)
Pandoc 3.1.6より、ページ設定の余白のとじしろが反映されていないバグが修正されました。
こういった細かいバグはまだあると思いますので、見つけたらpandoc-discussやPandocのIssueにどんどん報告していきましょう!