1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み] 型 'closure' を型 'character' のベクトルに強制することはできません。

2022-01-12 02:44:31

質問

shinyを使用してインタラクティブな散布図を作成しようとしています。虹彩のデータを使って、散布図 *petal vs sepalのxとyの次元をユーザーが選択し、選択された次元の単純な散布図を出力したいと思います。かなり簡単ですね。

まず、次元を表す文字列をggplotに渡すための関数を作る必要がありました。これを作って静的なデータでテストしてみました。うまくいった。

次に、花弁と萼の寸法(これらは私のX軸とY軸です)について、2つのドロップダウンとそれに続く2つの文字列(shinyを使用)を定義しました。

次に、shinyのreactive()関数を使って、switch文で2つの文字列変数を設定します。

コードは以下の通りです。

UI.R

library(shiny)

# Define UI for dataset viewer application
shinyUI(fluidPage(

# Application title
titlePanel("Shiny Text"),

# Sidebar with controls to select a dataset and specify the
# number of observations to view
sidebarLayout(
  sidebarPanel(
    selectInput("dataset1", "Choose a Sepal Measure:", 
              choices = c("Sepal Length", "Sepal Width")),

    selectInput("dataset2", "Choose a Petal Measure:", 
              choices = c("Petal Length", "Petal Width"))
 ),

 # Main Scatter Plot
 mainPanel(

   textOutput("testvar"),

   plotOutput("myplot")
   )
  )
))

サーバー.R

library(shiny)
library(datasets)

library(ggplot2)

#Define a function to plot passed string variables in ggplot

myplotfunct = function(df, x_string, y_string) {
  ggplot(df, aes_string(x = x_string, y = y_string)) + geom_point()
}

shinyServer(function(input, output) {

# Sepal Inputs
datasetInput1 <- reactive({
  switch(input$dataset1,
       "Sepal Length" = "Sepal.Length",
       "Sepal Width" = "Sepal.Width")
})

# Petal Inputs
datasetInput2 <- reactive({
  switch(input$dataset2,
       "Petal Length" = "Petal.Length",
       "Petal Width" = "Petal.Width")
})

#Debug print value of sting being passed
output$testvar = renderText(print(datasetInput1))

# Plot
output$myplot = renderPlot({myplotfunct(iris, datasetInput1, datasetInput2)})

})

エラーが出ます。

Error: cannot coerce type 'closure' to vector of type 'character'

私は自分のコードをデバッグするために、いくつかのステップを踏みました。まず、私のコードの最終行にハードコードされた寸法 (例えば "Petal.Length") を差し込みました output$myplot = renderPlot({myplotfunct( ...)

これは素晴らしい動作です。プロットは私が期待したとおりに描画されます。

次に、このplot関数に渡す文字列の値を追跡するためのデバッグ行を追加しました。ビンゴです。空っぽです。なぜ ?? UI.rファイルから値を渡す必要があるように思われます。

解決方法は?

最後の2行のdatasetInput1、datasetInput2の呼び出しがエラーの原因です。

代わりに datasetInput1() と datasetInput2() を呼び出す必要があります。そうしないと、R はこの関数を char に変換しようとします。そうであるべきです。

#Debug print value of sting being passed
output$testvar = renderText(print(datasetInput1()))

# Plot
output$myplot = renderPlot({myplotfunct(iris, datasetInput1(), datasetInput2())})

は {{コード を使用すると、リアクティブ要素自体と対話するのではなく、リアクティブ要素の値を取得することができます。これはShinyのかなり基本的なコンセプトで、もしまだ馴染みがないのであれば、おそらく シャイニーチュートリアル

()をつけるだけで、以下のようにエラーが出なくなります。