मैं अपने pmap_dfc स्टेटमेंट में तीसरे डायनामिक लिस्ट एलिमेंट को कैसे जोड़ूँ

Nov 25 2020

मेरे पास निम्नलिखित कार्य कोड है जो सिमुलेशन आउटपुट का उत्पादन करने के लिए दो सूचियों का उपयोग करता है:

strategy_list <- list("s_Win","s_WinH1", "s_WinH2", "s_WinH1F1", "s_WinH2F2", "s_WinDerEx")
function_list <- list(s_win, s_winH1, s_winH2, s_winH1F1, s_winH2F2, s_winDerEx)
l <- list(strategy_list, function_list)
simulation <- pmap_dfc(l, ~ df %>%
                      transmute(!! .x := .y(entries, skill, field, win_payoff, wager_amt, Winner, exacta_payoff))) %>%
  bind_cols(df, .) 

अब मैं कई अलग-अलग कौशल स्तरों पर सिमुलेशन चलाना चाहता हूं, इसलिए मैंने एक लूप जोड़ा है और अनुकरण के कई रूपों को बनाने के लिए कौशल इनपुट को लूप से बदलने की कोशिश की है:

for (i in seq(from = 0.15, to=0.30, by=0.05)){
skill_list <- list(i, i, i, i, i, i)
strategy_list <- list("s_Win","s_WinH1", "s_WinH2", "s_WinH1F1", "s_WinH2F2", "s_WinDerEx")
function_list <- list(s_win, s_winH1, s_winH2, s_winH1F1, s_winH2F2, s_winDerEx)
l <- list(skill_list, strategy_list, function_list)
simulation <- pmap_dfc(l, ~ df %>%
                      transmute(!! .w !! .x := .y(entries, i, field, win_payoff, wager_amt, Winner, exacta_payoff))) %>%
  bind_cols(df, .)
}

दुर्भाग्य से, यह एक त्रुटि पैदा कर रहा है। मैंने कई बदलावों की कोशिश की है, लेकिन काम करने के लिए कोड प्राप्त नहीं कर सकता।

EDIT: नीचे दिए गए Atem के पोस्ट के आधार पर, मैंने अपना कोड निम्नानुसार अपडेट किया है:

for (i in seq(from = 0.15, to=0.30, by=0.05)){
strategy_list <- list("s_Win","s_WinH1", "s_WinH2", "s_WinH1F1", "s_WinH2F2", "s_WinDerEx") %>% stringr::str_c(i)
function_list <- list(s_win, s_winH1, s_winH2, s_winH1F1, s_winH2F2, s_winDerEx)
skill_list <- list(i, i, i, i, i, i)
l <- list(strategy_list, function_list, skill_list)
simulation <- pmap_dfc(l, ~ df %>%
                      transmute(!! ..1 := ..2 (entries, ..3, field, win_payoff, wager_amt, Winner, exacta_payoff))) %>%
  bind_cols(df, .)  %>% 

दुर्भाग्य से, यह अभी भी एक त्रुटि पैदा कर रहा है। समस्या के साथ प्रकट होता है .. 2 के रूप में यह एक ही वाक्यविन्यास के रूप में प्रकाश डाला प्राप्त नहीं करता है .. 1 और .. 3।

EDIT 2: इसे थोड़ा सरल बनाने के लिए मैंने अपने प्रश्न के सरलीकृत संस्करण को एक साथ रखा है और इसमें एक रेप्रेक्स शामिल किया है। दो सूचियों के साथ सिमुलेशन 1 ठीक काम करता है। तीन सूचियों के साथ सिमुलेशन 2 और लूप त्रुटि संदेश के साथ विफल रहता है: फ़ंक्शन ".. 2" नहीं मिला।

``` r
library(tidyverse)
z <- 5

df <- tibble(x=1:10, y=1:10)

s_win <- function(x,y,z){
a <-rnorm(x) + x + y + 1 +z
a
}

s_win1 <- function(x,y,z){
b <-  rnorm(x) + x + y + 2 + z
b
}

s_win2 <- function(x,y,z){
c <-  rnorm(x) + x + y + 3 +z
c
}

# Simulation1 with two list works.  

strategy_list <- list("s_Win","s_Win1", "s_Win2") 
function_list <- list(s_win, s_win1, s_win2)
l <- list(strategy_list, function_list)
simulation1 <- pmap_dfc(l, ~ df %>%
                      transmute(!! .x := .y (x, y, z))) %>%
  bind_cols(df, .)  %>% 
  pivot_longer(
   cols = starts_with("s_"),
   names_to = "Strategy",
   names_prefix = "s_",
   values_to = "Value",
   values_drop_na = TRUE
 ) 
    
View(simulation1)


# Simulation 2 with thre list does not work.  Error message = could not find function "..2"

for (i in seq(from = 5, to=20, by=5)){
strategy_list <- list("s_Win","s_Win1", "s_Win2") %>% stringr::str_c(i)
function_list <- list(s_win, s_win1, s_win2)
skill_list <- list(i, i, i)
l <- list(strategy_list, function_list, skill_list)
simulation2 <- pmap_dfc(l, ~ df %>%
                      transmute(!! ..1 := ..2 (x, y, ..3))) %>%
  bind_cols(df, .)  %>% 
  pivot_longer(
   cols = starts_with("s_"),
   names_to = "Strategy",
   names_prefix = "s_",
   values_to = "Value",
   values_drop_na = TRUE
 )
}
#> Error: Problem with `mutate()` input `s_Win5`.
#> x could not find function "..2"
#> i Input `s_Win5` is `..2(x, y, ..3)`.
View(simulation2)  
#> Error in as.data.frame(x): object 'simulation2' not found
```

2020-11-25 को रेप्रेक्स पैकेज (v0.3.0) द्वारा बनाया गया

जवाब

1 ArtemSokolov Nov 25 2020 at 22:56

कॉलम नाम संग्रहीत किए जाते हैं strategy_list, जो आप को शामिल करना चाहते हैं i:

strategy_list <- list("s_Win","s_WinH1", "s_WinH2",
                      "s_WinH1F1", "s_WinH2F2", "s_WinDerEx") %>% 
                   stringr::str_c(i)

क्योंकि अब आप में तीन सूचियों है l, आप भी उपयोग करने के लिए स्विच करना चाहते हैं ..1, ..2आदि के बजाय .xऔर .y(केवल तर्क के दो सेट के लिए उपयुक्त हैं जो):

simulation <- pmap_dfc(l, ~ df %>%
                      transmute(!! ..1 := rlang::exec(..2, entries, ..3, field, win_payoff, 
                                              wager_amt, Winner, exacta_payoff))) %>%
  bind_cols(df, .)

लघु नोट : !!ऑपरेटर को "निर्विवाद" के रूप में जाना जाता है। इसके बिना, transmuteएक स्तंभ कहा जाता है पैदा करेगा .xबजाय संग्रहीत नामों का उपयोग करने में .x । यहाँ एक उदाहरण है जो अंतर प्रदर्शित करता है:

x <- "result"
mtcars %>% transmute( x = "Hello World" )
#              x
# 1  Hello World
# 2  Hello World
# ...

mtcars %>% transmute( !!x := "Hello World" )
#         result
# 1  Hello World
# 2  Hello World
# ...

ईडीआईटी ..2मुद्दे को संबोधित करने के लिए : किसी कारण से, एक समारोह युक्त के रूप में pmapव्याख्या करने के साथ मुद्दे हैं ..2rlang::execदिए गए तर्कों के साथ उस फ़ंक्शन को निष्पादित करने के लिए एक सरल समाधान का उपयोग करना है:

simulation2 <- pmap_dfc(l, ~ df %>%
                      transmute(!! ..1 := rlang::exec(..2, x, y, ..3))) %>%
    # ... as before

मैंने मूल उत्तर को ऊपर भी अद्यतन किया।